Postgres缓慢运行删除查询

问题描述:

我们有一个表格,其中有超过62k行。我们正在运行就可以了很简单的删除查询其需要45分钟才能完成:Postgres缓慢运行删除查询

DELETE FROM myTable WHERE createdtime < '2017-03-07 05:00:00.000' 

的事情,我们曾尝试:

1加时间戳列的索引,这并没有帮助。

2-使用函数删除了批次为20或50的行,该函数仍然非常慢。

3-删除了引用该表的所有外键约束和它自己的主键约束,这有助于减少时间到几秒钟,但我们无法安全地在生产数据库上执行此操作,因为它会锁定表,并防止事务正在运行时读写。

我不认为这个查询花了很长时间才能完成是正常的。任何建议表示赞赏。

+5

'删除引用此表的所有外键约束'这些FK的索引是否支持它们(在* other *表上)? – joop

+0

他说什么。很明显,花在查找FK约束上的时间是 – paqash

+0

性能问题应该包括EXPLAIN ANALYZE以及关于表大小,索引,当前时间性能,期望时间等的一些信息。慢是一个相对项,我们需要真正的值来比较。 MySQL也请阅读[如何 - 问](http://*.com/help/how-to-ask) – e4c5

... Dropped all the foreign key constraints referencing this table

确保这些FK的指标都支持他们(另表)。 删除时,(级联)FK将必须检查其他表中可能引用此行的所有FK列。


- 例如:

CREATE TABLE team(
     id INTEGER NOT NULL PRIMARY KEY 
     , name varchar UNIQUE 
     ); 

CREATE TABLE player(
     id INTEGER NOT NULL PRIMARY KEY 
     , team_id integer REFERENCES team(id) 
     , name varchar UNIQUE 
     ); 

现在,如果一个team被删除,FK约束则要检查是否有有关本team_id任何球员。 (和级联appropiately) 在这种情况下,在FK支持性指标将有助于DBMS:

CREATE index ON player(team_id); 

将有助于是有点太弱了这里。对于每一个非平凡的案例,绝对需要一个支持性指数。 (即使FK约束有ON UPDATE NO ACTION ON DELETE NO ACTION作为它的动作,所以它似乎)

+0

为了每个人的利益,即使我的FKs都设置为ON UPDATE NO ACTION DELETE NO ACTION,但这个检查似乎已经发生,导致查询运行缓慢,这对我来说是令人惊讶的。 – infiniteLoop

+0

@infiniteLoop:这根本就不奇怪,因为数据库需要确保没有玩家引用你正在删除的“团队”。如果没有索引,那么查找基本上是使用'select * from player'来完成的,其中team_id = ...',这将需要播放器表上的Seq扫描。 –

+0

@a_horse_with_no_name:但为什么需要这样做呢?检查它是否打算删除与被删除父行关联的子行? – infiniteLoop