我正在努力优化一些使用频繁的存储过程并遇到一个场景,这个场景引发了一个我无法找到任何答案的问题:在存储过程中评估TSQL时,SQL Server是否会短路{ {1}}陈述?
例如,假设存储过程的代码类似于:
IF
在这种情况下,SQL Server是否会使评估短路,以便在前面的子句求值为true时永远不会执行IF @condition1 = 1
OR EXISTS(SELECT 1 FROM table1 WHERE column1 = @value1)
...
语句?
如果它从未或有时只是,那么我们会在我们面前进行一些重写。
答案 0 :(得分:6)
即使看起来有效,也不应该依赖它。 CASE声明是文档中唯一声明为短路的声明,但即便如此(或者至少不是 嘻嘻)。这是一个bug,幸运的是从SQL Server 2012开始修复(参见评论)。
除了@Martin在该问题上发表的评论中的评论中的链接兔子洞(肯定是一个有趣的洞)之外,你还应该查看这篇文章:
Understanding T-SQL Expression Short-Circuiting
和讨论论坛与该文章有关。
答案 1 :(得分:3)
好消息是它似乎短路了。这是一个最小的例子:
DECLARE @condition1 bit = 1
IF (@condition1 = 1) OR EXISTS(SELECT 1 FROM sys.objects)
PRINT 'True'
ELSE
PRINT 'False'
当@condition
设置为1时,这是执行计划:从sys.objects
扫描0行
当@condition
设置为0时,它扫描了sys.objects
表:
但不能保证每次都会出现这种情况。