查看其他问题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陈述是唯一保证短路的陈述。
我希望第一个表达式很好,因为它更易读,更容易输入。
答案 0 :(得分:3)
SQL Server是否短路您的特定表达式与此无关,它将以任一方式生成正确的结果。在这种情况下,短路仅仅是一种优化。
至于优化,取决于索引的构建方式。这些(理想情况下)是指数寻求。
答案 1 :(得分:2)
你的问题根本没有任何意义。您的case
语句实际上比原始or
更复杂。原始or
必须做什么来评估两个表达式?类似的东西:
其中只有一个确实有任何时间与之相关 - 从记录中获取值可能涉及多个硬件操作。
case
需要做什么:
我不知道这有多简单。
无论如何,你真正的问题不是微观优化。真正的性能问题是SQL引擎是否可以使用索引进行查询。使用or
会使索引出现问题。因此,如果性能是主要问题,并且您具有适用于不同条件的适当索引,则可以考虑使用动态SQL。