DOO*_*EMX 2 t-sql sql-server-2005 database-performance
我有一个关于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中依赖它.
优化器可以自由地评估它认为合适的条件,并且在某些情况下可以评估表达式的两个部分,即使第二个评估不能改变表达式的结果(例子).
这并不是说它从不进行短路评估.您可能会在昂贵的条件下获得启动谓词,因此只在需要时执行.
此外,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)

| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |