【发布时间】:2012-12-31 05:24:42
【问题描述】:
假设我有一个包含 200k+ 行的表的数据库。
该表有一个 id 为 1800 的固定元组。其余的元组序列从 300k+ 开始。
我需要清理这张表,删除所有记录而不删除 id 为 1800 的一个寄存器。我想出了 3 种类型的查询,我可以运行:
DELETE FROM table WHERE id > 1800
DELETE FROM table WHERE id <> 1800
DELETE FROM table WHERE id NOT IN (1800)
我感觉第一个比其他更快,但我不确定,因为所有其他数据的 id 都大于 1800。
其中哪一个更快,为什么?另外,如果有一种更快捷的方法可以删除除无法删除的记录之外的记录,请告诉我。
【问题讨论】:
-
最快的可能是将您想要的一条记录复制到临时表中,截断该表,然后将一条记录插入回去
-
除非查询优化器完全是垃圾(这不太可能),否则这三个是一样的。
-
视情况而定。如果 id 是(主)键(或索引字段),则三个查询将具有相当的性能。否则:任何事情都会发生,这取决于 id 域的索引和基数。
-
是否涉及外键?如果是这样,那也会极大地影响性能。无论如何,如果没有外键,复制记录和截断可能会起作用。如果有外键,那么删除所有其他行是要走的路,遗憾的是它很慢。此外,如果有 FK,请确保它们在引用行上有索引。
标签: sql postgresql optimization sql-delete