我有一個簡單的表與任何其他無關。它有一個不是PK欄,它是一個日期。我爲該列創建了非聚集索引。如果我提出以下查詢:SQL Server不使用索引比較日期時間不爲空
select * from table where datecolumn is not null < - 不使用索引,速度非常慢。
但是,如果我刪除不是,這樣: select *從哪裏datecolum爲空的表< - 使用索引,真的很快。
還有更多不是空值而不是空值。
我忘了什麼嗎?我可以在這裏使用過濾索引嗎?
在此先感謝。
我有一個簡單的表與任何其他無關。它有一個不是PK欄,它是一個日期。我爲該列創建了非聚集索引。如果我提出以下查詢:SQL Server不使用索引比較日期時間不爲空
select * from table where datecolumn is not null < - 不使用索引,速度非常慢。
但是,如果我刪除不是,這樣: select *從哪裏datecolum爲空的表< - 使用索引,真的很快。
還有更多不是空值而不是空值。
我忘了什麼嗎?我可以在這裏使用過濾索引嗎?
在此先感謝。
這是正常現象。它不會使用索引,除非謂詞足夠有選擇性以保證它。
這聽起來像絕大多數記錄不是NULL,因此,而不是通過非聚集索引找到這些,然後不得不做大量的書籤查找和隨機I/O來檢索其餘的列以返回它更快更有效地掃描整個聚集索引。
您可以使用FORCESEEK
強制您要求的行爲。與聚集索引掃描相比,您可能會發現所花費的時間和I/O統計數據經歷了屋頂。
關鍵要了解您的問題可能是這句話:有更多的不超過零點零點。
SQLServer(以及任何其他關係數據庫)使用統計信息來確定它將要使用的查詢計劃是什麼。統計信息可能會告訴數據庫有很多非空日期的行。因此,也許SQLServer認爲使用索引是不值得的和完整表掃描是一個更好的計劃,該具體查詢與NOT NULL條件。
兩件事情我想提一提:使用
PK?空值?什麼? – AlexanderMP 2010-09-30 11:06:54
@亞歷山大 - 「它有一個**不**的PK欄......」 – 2010-09-30 11:09:22
哦,我的錯。不必要的提及「PK」讓我感到困惑。人們可以列舉數千件實體不是,只有2-3件。封閉的世界假設找到了我。 – AlexanderMP 2010-09-30 12:44:03