IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
如果
CONDITION 1
是TRUE
,将检查CONDITION 2
?如果
CONDITION 3
是FALSE
,将检查CONDITION 4
?WHERE
上的条件如何:SQL Server引擎会优化WHERE
子句中的所有条件吗?程序员是否应该以正确的顺序放置条件,以确保SQL Server优化器以正确的方式解析它? 已添加:
感谢Jack的链接,t-sql代码给我们带来了惊喜:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
有
结论:
如果C ++ / C#/ VB发生短路,为什么SQL Server无法拥有它?
为了真正回答这个问题,让我们看一下两者在
条件下如何工作。 C ++ / C#/ VB均具有
语言规范中定义的短路功能,以加快代码执行速度。为什么要麻烦第一个条件为真的情况下评估N OR条件,或者为什么当第一个条件为假的条件下M条件呢?
作为开发人员,我们必须意识到SQL服务器的工作方式不同。
这是一个基于成本的系统。为了获得针对我们的查询的最佳执行计划,查询处理器必须评估每个条件,并为其分配成本。然后,对这些成本进行整体评估,以形成一个
阈值,该阈值必须低于SQL Server为良好计划所定义的阈值。如果成本低于定义的阈值,则使用
计划,如果没有,则使用条件成本的不同组合再次重复整个过程。这里的成本要么是扫描,要么是搜索
,或者是合并联接或哈希联接等。因此,在C ++ / C#/ VB中出现的
短路根本是不可能的。
您可能会认为强制在列上使用索引被认为是短路
,但事实并非如此。它仅强制使用该索引,并且
这样可以缩短可能的执行计划列表。该系统仍然是基于成本的。
作为开发人员,您必须意识到SQL Server不会像其他编程语言那样短路
,并且
/>您无法执行任何强制措施。
#1 楼
在SQL Server中不能保证是否在WHERE
子句中处理语句或以什么顺序处理语句。允许语句短路的单个表达式是CASE
-WHEN
。以下是我在Stackoverflow上发布的答案的答案:SQL Server如何短路WHERE条件评估
它在感觉到时就起作用了,但是并没有您立即想到的那样。
作为开发人员,您必须意识到SQL Server不会像其他编程语言那样发生短路,并且您无法执行任何强制措施。
有关详细信息请检查上述博客条目中的第一个链接,该链接指向另一个博客:
SQL Server短路了吗?
最终裁决?好吧,我还没有一个,但是可以肯定地说,唯一可以确保特定短路的时间是在CASE表达式中表达多个WHEN条件时。使用标准的布尔表达式,优化器将根据要查询的表,索引和数据按自己认为合适的方式进行移动。
评论
显然,在某些极端情况(或错误)中,甚至情况都不安全
–杰克·道格拉斯(Jack Douglas)
2011年9月2日上午10:23
我还演示了CASE中断的另一种情况(ha!):dba.stackexchange.com/questions/12941/…
–亚伦·伯特兰(Aaron Bertrand)
2014年4月1日在16:16
#2 楼
在T-SQL中,IF
语句可能会短路,但是您不能依靠它按顺序评估表达式#3 楼
SQL是一种声明性编程语言。不同于命令式编程语言C ++。即您可以告诉它最终结果是什么,但是您不能决定结果如何执行,这完全取决于引擎。
保证“ short-
WHERE
内部的“循环”(或任何其他控制流)将使用索引视图,临时表和类似机制。 PS。您还可以使用执行计划提示(以“提示”引擎如何执行查询,要使用的索引以及如何使用它们),只是以为我应该提到它,而我们正在讨论此主题...
#4 楼
1)-OR(或任意一个或两个条件都为TRUE)如果条件1为TRUE,则条件2也将被检查为TRUE或FALSE
- -AND(两个条件都必须为TRUE)
如果条件1为FALSE,则将不检查条件2
评论
“如果条件1为FALSE,则将不检查条件2”这是不正确的。请参阅上面的答案。 SQL Server可能仍会评估条件2,因为它不会在WHERE子句中执行短路评估。
–尼克·查玛斯(Nick Chammas)
2011年9月9日23:04
#5 楼
控制WHERE子句中条件的唯一方法是使用方括号将它们分组在一起。WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'
与
WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')
有很大不同评论
只是好奇。这两个条件有何不同?不同的结果,性能,执行计划?我以为他们会是等效的。
–超立方体ᵀᴹ
2012年6月24日21:01
对于第一个,您需要匹配Col1,Col4以及Col2或Col3。在第二行中,要匹配Col1和Col2,或者您需要匹配Col3和Col4,但是Col1和Col4永远都不需要一起求值。
–mrdenny
2012年7月1日下午13:16
不,你错了。 AND的优先级高于OR。两者是等效的。您所说的对于WHERE Col1 = x AND(Col2 = x OR Col3 = x)AND Col4 = x查询将是正确的。请参阅SQL-Fiddle测试
–超立方体ᵀᴹ
2012年7月1日13:27
评论
最终报价块从哪里来?您可以添加参考吗?