gpt4 book ai didi

postgresql - Postgres 运行缓慢的删除查询

转载 作者:行者123 更新时间:2023-11-29 11:37:48 34 4
gpt4 key购买 nike

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

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

我们尝试过的事情:

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

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

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

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

最佳答案

...删除所有引用此表的外键约束

确保这些 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);

will help 在这里有点太弱了。每个非平凡的案例都绝对需要一个支持性索引。 (即使 FK 约束具有 ON UPDATE NO ACTION ON DELETE NO ACTION 作为其操作,看起来也是如此)

关于postgresql - Postgres 运行缓慢的删除查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42701108/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com