Postgres慢速运行删除查询

时间:2017-03-09 16:55:20

标签: postgresql foreign-keys sql-delete postgresql-performance

我们有一张表只有超过62k行。我们正在运行一个非常简单的删除查询,需要45分钟才能完成:

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

我们尝试过的事情:

1-在timestamp列上添加了一个索引,但没有帮助。

2-使用函数分批删除20或50行,这仍然非常慢。

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

我拒绝相信此查询花费这么长时间才能完成。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:10)

... 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。 (和适当的级联)     在这种情况下,FK的支持性索引将有助于DBMS:

CREATE index ON player(team_id);

会帮助在这里有点太弱了。每个非平凡案例都绝对需要一个支持性指数。 (即使FK约束的{em>动作有ON UPDATE NO ACTION ON DELETE NO ACTION,所以看起来似乎)