2012-02-28 68 views
2

我有一個SQL查詢,其執行計劃取決於我提供的DateTime參數。我明白,如果我有這樣一個條件:SQL Server 2008:執行計劃取決於日期參數

WHERE Date > '2012-02-28' AND Date < '2012-01-01' 

則執行計劃將只是一個恆定的評價,因爲沒有結果返回。但在其他情況下,我會得到不同的執行計劃,這對我來說沒有任何意義。例如有條件:

WHERE Date >= '2012-02-01 00:00:00' AND Date <= '2012-02-02 22:00:00' 

該查詢使用我添加並優化的索引。但如果我將條件更改爲:

WHERE Date >= '2012-02-27 00:00:00' AND Date <= '2012-02-27 22:00:00' 

它不再使用索引。

在運行查詢之前,我重建了此表上的所有索引。我在這找不到任何邏輯。所以我的問題是:DateTime參數如何影響爲查詢選擇哪個執行計劃?

編輯:顯然,原因是我有一個額外的索引在日期只困惑的SQL Server。刪除索引後,所有內容都按預期工作。但是,謝謝你的想法。我沒有提供足夠的細節讓你弄清楚。索引太多從來都不好!

回答

1

SQL Server對錶內容進行統計並根據這些統計信息構建查詢計劃。

例如。當我有一張包含100萬條記錄的表,其中900.000條記錄介於2012-02-27和2012-02-28之間時,查詢管理器將執行表掃描以讀取數據。如果只有10%的數據具有這兩個值之間的日期,則它將傾向於使用您創建的索引。

統計模型的一個問題是「過時統計」。無論何時超過一定百分比的表或超過500條記錄+(數據基數的20%)都被更改,SQL Server將執行「自動更新統計」。 (see this article)。

因此,如果您的統計數據過期,SQL Server可能會提出不正確的查詢計劃。

1

您的索引可能被過濾,這將導致它僅用於某些查詢。你可以看一下索引定義,以確定此

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/

否則,你的表可能被劃分?

如果這些都沒有幫助,我需要更多的信息來提出進一步的建議。

+0

感謝您的想法(我甚至不知道過濾索引存在)。該索引未被過濾,表未分區。查詢計劃似乎取決於統計數據。 – 2012-02-28 14:12:24