2011-08-02 34 views
5

我有一个日期列StartDate索引表。我只是想知道查询优化阶段如何处理以下形式的查询:查询优化阶段是否考虑到这一点?

SELECT * 
FROM <dbo.TABLE> 
WHERE (StartDate BETWEEN '2010-01-01' AND '2010-01-10') 
OR (StartDate BETWEEN '2010-01-05' AND '2010-01-15') 

这两个日期之间有重叠。我是否应该优化自己的日期作为(StartDate BETWEEN '2010-01-01' AND '2010-01-15')还是SQL引擎可以自行优化?

+1

执行计划显示什么? – gbn

+0

它向我展示了同样的计划。其实,让我深入了解每个组件,并在一分钟后回归。 – Legend

+0

好吧,它显示相同的I/O和CPU成本。猜你让我回答我自己的问题。 – Legend

回答

5

将其与变量和常量进行比较:计划应该不同。

SQL Server可以针对常量进行优化,但是旨在与变量重用。所以这个计划对变量更一般。当使用常量时,不需要“通用可重用计划”,因为如果常数改变,它将是一个新计划

“可变”计划不会考虑像end < start这样的条件,它将被常量短路。

正如评论的问题指出,行为如预期

你应该作出同样的发生常量与“Forced Parameterization”,但我没试过。