2011-12-15 41 views
2

可能重复:
SQL Server - Query Short-Circuiting?
Is the SQL WHERE clause short-circuit evaluated?OR的表现?

我有一个关于逻辑性能或运营商T-SQL(SQL Server 2005中)的问题。

我已经搜索了一些,但我找不到任何关于此主题的内容。

如果您有以下查询:

SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition) 

岂不程序解释器去尽可能的randomboolean并跳到为了节省性能的重型条件评价给出了第一个条件是真的吗?

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

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

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated – AakashM 2011-12-15 13:15:50

回答

5

You can't count on short circuit evaluation in TSQL

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

这并不是说它从来没有然而做短路评估。您可能会在昂贵的条件下启动谓词,因此只有在需要时才会执行。

此外,在您的查询中存在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 

Plan

+1

值得说明的是,很多这是由于并行性 - SQL Server正在检查两个条件完全同时在不同的线程中,这比检查最短的第一个线程更有效。 – JNK 2011-12-15 13:26:20

+0

是否意味着第二个条件的评估结束,如果第一个条件在另一个条件之前进行评估? – DOOMDUDEMX 2011-12-15 13:29:01

1

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

然而,网上的细节,这是limitted加盟条件,CASE语句等

看到这个SO发布... SQL Server - Query Short-Circuiting?

+0

短路通常指的是一种形式,谓词按照严格的顺序进行评估,直到因为整个结果是已知的,并且不评估其他谓词(例如从左到右评估)。但是正如你所看到的那样,在SQL中评估谓词的顺序并没有严格定义,所以我不会将其行为描述为短路 – 2011-12-15 13:20:36

-4

首先比地方被执行或当控制进入到第一condition.if第一条件为真比它不检查第二个条件。如果你给出了100的条件和操作员执行情况在这种情况下,第一个条件是假的,然后检查下一个条件。