SQL是否会短路WHERE CLAUSE中OR的评估?

时间:2016-10-18 19:23:15

标签: sql sql-server

查看其他问题here on SO和谷歌似乎表明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陈述是唯一保证短路的陈述。

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

2 个答案:

答案 0 :(得分:3)

SQL Server是否短路您的特定表达式与此无关,它将以任一方式生成正确的结果。在这种情况下,短路仅仅是一种优化。

至于优化,取决于索引的构建方式。这些(理想情况下)是指数寻求。

答案 1 :(得分:2)

你的问题根本没有任何意义。您的case语句实际上比原始or更复杂。原始or必须做什么来评估两个表达式?类似的东西:

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

其中只有一个确实有任何时间与之相关 - 从记录中获取值可能涉及多个硬件操作。

case需要做什么:

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

我不知道这有多简单。

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