2011-08-02 66 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」,但我沒試過。