2

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

我对 T-SQL (SQL Server 2005) 中逻辑 OR 运算符的性能有疑问。

我已经搜索了一下,但我找不到任何关于这个主题的东西。

如果您有以下查询:

SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition)

考虑到第一个条件为真,程序解释器是否会randomboolean为了节省性能而跳过重条件的评估?

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

我知道它在 C# 中是这样工作的,但我想知道我是否也可以在 T-SQL 中指望它。

4

3 回答 3

5

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

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

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

此外,OR查询中存在的 可以将可搜索的搜索条件转换为不可搜索的搜索条件,这意味着索引未得到最佳使用。尤其是在 SQL Server 2005 中(在 2008OPTION (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

计划

于 2011-12-15T13:16:07.587 回答
1

它被称为短路。是的,SQL Server 在某些情况下确实做到了。以何种顺序取决于许多因素并构成执行计划优化的一部分。

但是网上有详细说明这仅限于JOIN条件、CASE语句等。

请参阅此 SO 帖子... SQL Server - 查询短路?

于 2011-12-15T13:15:42.323 回答
-4

首先,执行条件而不是在控制转到第一个条件时执行 OR 运算符。如果第一个条件为真,则不检查第二个条件。如果给定 100 个条件并且在这种情况下第一个条件为假,则检查下一个条件.

于 2011-12-15T13:20:40.903 回答