【问题标题】:What's faster IN or OR?IN 或 OR 哪个更快?
【发布时间】:2010-11-10 07:49:53
【问题描述】:

在 T-SQL 中什么更快?

DELETE * FROM ... WHERE A IN (x,y,z)

或者

DELETE * FROM ... WHERE A = x OR A = y OR A = z

在我的例子中,x、y 和 z 是存储过程的输入参数。我正在尽我最大的努力使我的 DELETE 和 INSERT 语句的性能。

【问题讨论】:

    标签: tsql optimization profiling performance sql-optimization


    【解决方案1】:

    别想了;个人资料。

    我敦促您在考虑速度问题时不要依赖您或其他任何人的直觉。取而代之的是,尝试这两个选项,通过某种分析/运行时间测量,并找出在您的情况下哪个更快。

    【讨论】:

    • +1 感谢您支持我自己想说的话。 :-)
    【解决方案2】:

    “IN”将被翻译成一系列“OR”...如果您查看带有“IN”的查询的执行计划,您会发现它已经扩展了它。

    在我看来,使用“IN”更简洁,尤其是在较大的查询中,它使其更具可读性。

    【讨论】:

    • Thnx,在执行计划中我看到它会花费完全相同的 CPU 时间。
    • 这不是真的。 In 不被翻译为 ors 的系列。您最好分析您的查询并实际查看结果。 EXISTS 通常比 IN 快。但 OR 应该 比两者都快。不过,这取决于索引。
    • @Frank,我们谈论的是带有值列表的 IN,而不是带有子查询的 IN。
    • @Andrew:那么我对 EXISTS 的看法显然是错误的。但我仍然理解 SQL 服务器对 IN 和 OR 的内部化方式不同——子查询或常量值。
    • 在这种情况下它们是相同的。
    【解决方案3】:

    在测试服务器上编写两个存储过程,一个使用IN,另一个使用OR。将每个程序运行 10,000 次(或 1,000,000 次,或其他),然后比较时间。

    一般来说,这几乎是“唯一”回答哪种方法更快的问题的方法:编写简单的时序测试用例,并多次运行它们。

    【讨论】:

      【解决方案4】:

      SQL Server 中,优化器将为这些查询生成相同的计划。

      【讨论】:

        【解决方案5】:

        他们应该根据我的经验制定完全相同的计划

        看看计划

        【讨论】:

          【解决方案6】:

          如果A是一个计算,它将使用IN执行一次,使用OR执行N次。

          【讨论】:

            【解决方案7】:

            无论 A 是计算还是列,看起来 SQL Server 2005 都将 IN 转换为 OR 子句。

            【讨论】:

            • 如果您的 IN 的内容是另一个 SELECT 语句的结果,它也可能将其转换为连接。
            【解决方案8】:

            在 SQL Server 下,绝对最快的方法是使用带有 INNER JOIN 的 DELETE。使用三个值,您不会注意到差异,但是使用更多值(我们正在做几千个),差异是惊人的。您可以将您的值存储到临时表中,然后加入到该表中。

            例如

            DELETE C
            FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID
            

            您还可以添加可选的 where 子句。

            【讨论】:

              【解决方案9】:

              它必须完全相等。大多数 RDMBS 将 IN 转换为 ORs

              当然,如果您认为从INsORs 的翻译非常耗时,那么带有ORs 的句子会更快;-)

              更新:我认为A 是一列。

              【讨论】:

                猜你喜欢
                • 2011-09-24
                • 2019-07-15
                • 1970-01-01
                • 1970-01-01
                • 2020-05-28
                • 1970-01-01
                • 2014-10-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多