SQL Server是否会短路IF语句?

时间:2014-12-14 23:07:00

标签: sql-server tsql query-optimization short-circuiting

我正在努力优化一些使用频繁的存储过程并遇到一个场景,这个场景引发了一个我无法找到任何答案的问题:在存储过程中评估TSQL时,SQL Server是否会短路{ {1}}陈述?

例如,假设存储过程的代码类似于:

IF

在这种情况下,SQL Server是否会使评估短路,以便在前面的子句求值为true时永远不会执行IF @condition1 = 1 OR EXISTS(SELECT 1 FROM table1 WHERE column1 = @value1) ... 语句?

如果它从未或有时只是,那么我们会在我们面前进行一些重写。

2 个答案:

答案 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行

execution plan 1

@condition设置为0时,它扫描了sys.objects表:

execution plan 2

但不能保证每次都会出现这种情况。