我们有一个表,其行数刚刚超过 62k。我们正在对其运行一个非常简单的删除查询,需要 45 分钟才能完成:
DELETE FROM myTable WHERE createdtime < '2017-03-07 05:00:00.000'
我们尝试过的事情:
1-在时间戳列上添加了索引,但这没有帮助。
2- 使用函数批量删除 20 或 50 行,但这仍然非常慢。
3-删除引用该表的所有外键约束及其自己的主键约束,这确实有所帮助并将时间减少到几秒钟,但我们无法在生产数据库上安全地执行此操作,因为它将锁定表并阻止读取并在事务运行时写入。
我不相信这个查询需要这么长时间才能完成是正常的。任何建议表示赞赏。
... 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 约束有ON UPDATE NO ACTION ON DELETE NO ACTION
as its action, 所以它看起来)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)