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
作为其 动作 ,看起来也是如此)
我们有一个 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
作为其 动作 ,看起来也是如此)