【问题标题】:Which is faster? Multiple DELETE statements or a single DELETE Statement using "IN ('x', ''y')"哪个更快?使用 "IN ('x', ''y')" 的多个 DELETE 语句或单个 DELETE 语句
【发布时间】:2008-12-30 21:50:01
【问题描述】:

只是想知道哪个更快:

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')

有什么想法、提示或参考可以在哪里阅读?

谢谢大家!

【问题讨论】:

  • 批处理语句(即单个调用)是你的朋友!

标签: sql-server database


【解决方案1】:

单次删除会更快,原因如下:

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

【讨论】:

  • 什么是生成合法的 IN() 字符串的好方法,并且可能会变得很长?
  • @Haoest,这应该只是一个单独的问题。但是大多数数据库都有列表的最大长度。查看嵌套子查询。
  • Re: #1 如果您使用准备好的语句,这仍然是一个问题吗?回复:#2 如果你没有启用自动提交并且你手动启动了你的事务,那么一切都不是一个事务吗?
  • 如果 IN() 有很多值,最好将它们组装到临时表中并在该表上使用 JOIN 删除。
【解决方案2】:

单次删除速度更快,只需要创建和执行一个计划。

【讨论】:

    【解决方案3】:

    由于已经说明的原因,单个语句更快。

    在给出的例子中

    DELETE FROM table_name WHERE X BETWEEN 1 AND 3
    

    会更快,尤其是如果您在 X 上有聚集索引。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          单一语句:

          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')
          

          正如您在 cmets 中所写,如果您希望动态填充 IN() 子句,您可以使用如下子查询:

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

          (或其他)

          【讨论】:

          • 他正在使用Sql Server
          【解决方案7】:

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

          如果您的数据库支持使用prepared statements,那么您可以对语句进行prepare。

          DELETE FROM table_name WHERE X='?'
          

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

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

          【讨论】:

            猜你喜欢
            • 2012-03-21
            • 2020-06-27
            • 2017-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-17
            • 1970-01-01
            相关资源
            最近更新 更多