OR的表现?

DOO*_*EMX 2 t-sql sql-server-2005 database-performance

可能重复:
SQL Server - 查询短路?
是否对SQL WHERE子句进行了短路评估?

我有一个关于T-SQL(SQL Server 2005)中逻辑OR运算符性能的问题.

我搜索了一下,但我找不到任何关于这个问题的内容.

如果您有以下查询:

SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition)
Run Code Online (Sandbox Code Playgroud)

randomboolean在第一个条件成立的情况下,为了节省性能,程序解释器是否会尽可能地跳过评估重型条件?

由于OR语句中的一个值为true,因此我们不必评估第二个条件,因为我们已经知道满足第一个条件!

我知道它在C#中是这样的,但我想知道我是否也可以在T-SQL中依赖它.

Mar*_*ith 5

您不能指望TSQL中的短路评估.

优化器可以自由地评估它认为合适的条件,并且在某些情况下可以评估表达式的两个部分,即使第二个评估不能改变表达式的结果(例子).

这并不是说它从不进行短路评估.您可能会在昂贵的条件下获得启动谓词,因此只在需要时执行.

此外,OR查询中存在可以将可搜索的搜索条件转换为不可分析的搜索条件,这意味着索引未以最佳方式使用.特别是在SQL Server 2005中(2008年OPTION (RECOMPILE)可以帮到这里).

例如,比较以下计划.与该版本OR最终做了充分的索引扫描而不是一个索引查找到的具体数值.

DECLARE @number INT;
SET number  = 0;

SELECT COUNT(*)
FROM master..spt_values
WHERE @number IS NULL OR number = 0

SELECT COUNT(*)
FROM master..spt_values
WHERE  number = 0
Run Code Online (Sandbox Code Playgroud)

计划