2010-09-30 99 views
4

我有一個簡單的表與任何其他無關。它有一個不是PK欄,它是一個日期。我爲該列創建了非聚集索引。如果我提出以下查詢:SQL Server不使用索引比較日期時間不爲空

select * from table where datecolumn is not null < - 不使用索引,速度非常慢。

但是,如果我刪除不是,這樣: select *從哪裏datecolum爲空的表< - 使用索引,真的很快。

還有更多不是空值而不是空值。

我忘了什麼嗎?我可以在這裏使用過濾索引嗎?

在此先感謝。

+0

PK?空值?什麼? – AlexanderMP 2010-09-30 11:06:54

+0

@亞歷山大 - 「它有一個**不**的PK欄......」 – 2010-09-30 11:09:22

+0

哦,我的錯。不必要的提及「PK」讓我感到困惑。人們可以列舉數千件實體不是,只有2-3件。封閉的世界假設找到了我。 – AlexanderMP 2010-09-30 12:44:03

回答

3

這是正常現象。它不會使用索引,除非謂詞足夠有選擇性以保證它。

這聽起來像絕大多數記錄不是NULL,因此,而不是通過非聚集索引找到這些,然後不得不做大量的書籤查找和隨機I/O來檢索其餘的列以返回它更快更有效地掃描整個聚集索引。

您可以使用FORCESEEK強制您要求的行爲。與聚集索引掃描相比,您可能會發現所花費的時間和I/O統計數據經歷了屋頂。

​​
1

關鍵要了解您的問題可能是這句話:有更多的不超過零點零點

SQLServer(以及任何其他關係數據庫)使用統計信息來確定它將要使用的查詢計劃是什麼。統計信息可能會告訴數據庫有很多非空日期的行。因此,也許SQLServer認爲使用索引是不值得的和完整表掃描是一個更好的計劃,該具體查詢與NOT NULL條件。

兩件事情我想提一提:使用

  1. 查詢並不總是比不使用一個查詢更快。
  2. 您可以將索引提示在您的查詢中,但我通常會發現自己在腳下做那種優化