Postgres 慢 运行 删除查询

Postgres slow running delete query

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

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

我们尝试过的事情:

1- 在时间戳列上添加了索引,但没有帮助。

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

3- 删除所有引用此 table 的外键约束及其自己的主键约束,这确实有所帮助并将时间减少到几秒钟,但我们不能在我们的生产数据库上安全地执行此操作因为它将锁定 tables 并防止在事务为 运行.

时进行读写

我不相信这个查询需要这么长时间才能完成是正常的。任何建议表示赞赏。

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

确保这些 FK 具有支持它们的索引(在另一个 table 上)。 当您删除时,(级联)FK 将必须检查其他 table 中可能引用该行的所有 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 约束具有 ON UPDATE NO ACTION ON DELETE NO ACTION 作为其 动作 ,看起来也是如此)