【问题标题】:Does SQL short-circuit the evaluation of an OR in the WHERE CLAUSE? [duplicate]SQL 是否会缩短 WHERE 子句中 OR 的评估? [复制]
【发布时间】:2017-02-28 05:01:59
【问题描述】:

查看其他问题here on SO 和google 似乎表明MS Sql Server 不保证将WHERE 子句中的表达式短路。

这是否意味着像这样的 WHERE 表达式不能被信任工作...?

... WHERE (@include_voided = 1 OR mytable.void = 0) AND ... 

我经常在我的存储过程中使用这种表达式。由于另一个原因研究了短路,我现在想知道是否应该将其替换为 ...

... WHERE mytable.void = case when @include_voided=1 then mytable.void else 0 END

...因为所有文章似乎都表明 CASE 语句是唯一保证短路的语句。

我希望第一个表达式很好,因为它更易读,更容易输入。

【问题讨论】:

  • 顺便说一句,你会在@include_voided = NULL 上得到不同的结果。此外,您无法使这些搜索条件成为可搜索条件(即此处无法进行索引搜索),因此请使用更方便编写的方式。

标签: sql sql-server


【解决方案1】:

你的问题真的毫无意义。你的case 语句实际上比原来的or 更复杂。原始的 or 必须做什么才能评估 both 表达式?比如:

  • 将参数与 0 进行比较
  • 从记录中获取值
  • 与 0 比较

其中只有一个真正与时间相关联——从记录中获取值可能涉及多个硬件操作。

case需要做什么:

  • 从记录中获取一个值。
  • 将参数与 1 进行比较
  • 将值与 0 进行比较

我看不出这有什么更简单的。

无论如何,你真正的问题不是这样的微优化。真正的性能问题是 SQL 引擎是否可以使用索引进行查询。使用or 会使索引出现问题。出于这个原因,如果性能是主要考虑因素并且您针对不同的可能条件有适当的索引,则可以考虑使用动态 SQL。

【讨论】:

    【解决方案2】:

    无论 SQL Server 是否短路您的特定表达式在此处不相关,它都会生成正确的结果。在这种情况下,短路只是一种优化。

    至于优化,这取决于您的索引是如何构建的。这些是(理想情况下)索引搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2018-02-18
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2012-05-31
      • 2013-02-03
      相关资源
      最近更新 更多