2013-06-19 38 views
2

所以這裏是查詢和執行計劃。評論create-index陳述已被執行。 enter image description here爲什麼Sql Server更喜歡通過NonClustered + KeyLookup進行集羣索引掃描?

爲什麼Sql-Server決定執行聚集索引掃描?我錯過了什麼嗎?

+1

您正在選擇'*'。索引是否涵蓋所有列?表中有多少行?請提供'CREATE TABLE'和查詢作爲文本而不是截圖。 –

+0

@MartinSmith,不,索引並沒有涵蓋所有課程的列,這就是爲什麼我期待一個關鍵的查找。 –

+0

但知道我知道了,這是因爲sql-server的查詢優化器根據要掃描的頁面數來估計工作量,而我的表沒有那麼多的數據。 –

回答

3

如果查詢將使用索引,那就得搜索索引頁(至少2個),從結果中獲取聚簇索引鍵,然後通過聚簇索引搜索每個鍵(每個找到的記錄至少2個頁面讀取)以獲得剩餘的索引沒有被索引覆蓋的記錄。

可以是一種有效的方法,如果有大量的記錄,您的where子句只選擇其中的一個相對較小的子集(其中查詢優化器的估計基於索引的統計數據)。

從它的外觀來看,表中只有少量記錄,可能它們甚至可以放在一個頁面上,所以優化器會說「我可以通過讀取和過濾一個或兩個頁面來完成整個查詢聚集索引一次,這比在此情況下,整個非聚集索引經營方式更有效,所以我會做到這一點,饒恕我可憐的超載服務器引擎的麻煩」整個負載:-)

編輯:嘗試在WHERE子句之前指定WITH(INDEX(idx_WP_Discrepancy_FilterColumns2)),並將查詢計劃中的估計子樹成本與原始查詢進行比較以查看差異。

0

查詢計劃可能會被緩存。添加:

option (recompile) 

在查詢結束時強制執行新的編譯。

+0

添加新索引將導致任何相關計劃被自動刪除。 –

+0

@MartinSmith:[MSDN](http://msdn.microsoft.com/zh-cn/library/ms181055(v = sql.105).aspx)表示否則。向查詢中引用的表添加索引不在使計劃失效的操作列表中。 – Andomar

+0

可能不是一個全面的列表。很確定你會得到一個基於最優化的重新編譯。將嘗試找到一個來源。 –

相關問題