2013-05-01 73 views
2

創建一個覆蓋非聚集索引以滿足給定查詢的要求。 如果索引中不存在一列,則SQL服務器將需要執行密鑰查找。爲了防止密鑰查找,創建了覆蓋索引,但是我不明白爲什麼以下是覆蓋索引,而其中一列未包括。涵蓋索引adventureworks 2008 R2 - 爲什麼不包含column WorkorderID?

數據庫:了Adventureworks 2008 R2 表:Production.WorkOrder 指標名稱:IX_WorkOrder_ProductID

查詢:

SELECT WorkOrderID,StartDate 
FROM Production.WorkOrder 
WHERE ProductID = 757; 

IX_WorkOrder_ProductID僅列開始的ProductID 它刪除並重新創建爲索引如下:

CREATE INDEX IX_WorkOrder_ProductID 
ON Production.WorkOrder (ProductID) 
INCLUDE (StartDate); 

執行後實際執行計劃使用索引查找(非集羣),成本爲 100%。

我的問題是:爲什麼不需要將WorkOrderID列添加到索引 IX_WorkOrder_ProductID?爲什麼它是一個沒有WorkOrderID的覆蓋索引?

回答

4

由於WorkOrderID是該表Production.WorkOrder聚集索引,它是已經和自動包含在你對錶中創建的每一個非聚集索引。

真的沒有必要再包括它 - 它已經在那裏。

所以,你的新的索引IX_WorkOrder_ProductID其實涵蓋了查詢 - 在WorkOrderID存在由於聚集鍵存在於非聚集索引反正,和ProductID列索引定義的一部分。

由於聚簇索引鍵被包含在該表的每個非聚簇索引中,因此應該非常仔細地選擇聚簇鍵,並且應該儘可能小 - 理想情況下INTBIGINT

+0

明白了。非常感謝。 – 2013-05-01 21:09:58

相關問題