哪个更快?使用“IN('x',''y')”的多个DELETE语句或单个DELETE语句“

时间:2008-12-30 21:50:01

标签: sql-server database

只是想知道哪个更快:

DELETE FROM table_name WHERE X='1'
DELETE FROM table_name WHERE X='2'
DELETE FROM table_name WHERE X='3'

DELETE FROM table_name WHERE X IN ('1', '2', '3')

任何想法,提示或参考资料在哪里阅读?

谢谢大家!

7 个答案:

答案 0 :(得分:19)

由于以下几个原因,单次删除会更快:

  1. 只需要一个计划 产生
  2. 只有一笔交易 涉及(如果您正在使用它们)
  3. 如果您是从代码运行这些, 然后有更少的开销 ODBC调用和网络流量
  4. 任何索引都需要 只刷过一次,而不是很多次。

答案 1 :(得分:3)

单个删除速度更快,只有一个计划可以创建和执行。

答案 2 :(得分:3)

由于已经陈述的原因,单一陈述更快。

在给出的例子中

DELETE FROM table_name WHERE X BETWEEN 1 AND 3

会更快,特别是如果你在X上有一个聚集索引。

答案 3 :(得分:1)

使用索引和数据在数据库中对其进行配置。我倾向于同意使用单个语句,但是,我可以想到一些快速实例,3个语句会快得多。如果真的很重要,请进行描述。

答案 4 :(得分:1)

由于kogus提到的原因,单个删除通常更快。

但是......请记住,如果你必须消灭200万行表中的50%并且对表有很多活动,请小批量删除或选择新表并交换该表可能是更好的方法。

答案 5 :(得分:1)

单一陈述:

DELETE FROM table_name WHERE X IN ('1', '2', '3')

......会更快。我不确定您使用的是哪个数据库,但我建议您查看execution plan个查询。如果您使用的是MySQL,则可以使用EXPLAIN命令,如:

EXPLAIN DELETE FROM table_name WHERE X IN ('1', '2', '3')

正如您在评论中写的那样,如果您希望动态填充IN()子句,您可以使用子查询,如:

DELETE FROM table_name WHERE x IN (SELECT id FROM table_name WHERE Y = Z)

(或其他)

答案 6 :(得分:0)

我认为您可能需要考虑第三种选择。我认为它可能比你的第一个例子更好,但不如你的第二个例子好。

如果您的数据库支持使用预备语句,那么您可以对该语句进行准备。

DELETE FROM table_name WHERE X='?'

然后简单地用值1,2和3调用它。

一般来说,我的经验是,当您使用基于集合的操作时,如第二个示例,您将获得最佳性能。