2012-09-24 39 views
0

兩個查詢使用「顯示估計的執行計劃」後的一個指標,我結束了創建兩個指標如下:兩項指標有幾列或所有列

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table 
(colA,colB,colC) 

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table 
(colA,colD,colE) 

我注意到,剛剛創建一個索引(取代上述兩種):

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table 
(colA,colB,colC,colD,colE) 

還可以優化我的查詢。

所以我的問題是,這是正確的索引與所有列優化以及兩個單獨的或一種方法比其他更好。

感謝

回答

1

要簡單地回答你的問題,順序很重要(想想一個多層次的樹),所以組合索引將不會與一個查詢,只搜索可樂,冷,和科爾,而不是COLB和幫助COLC。

因此,舉例來說,如果你有一個像 SELECT colA, colD, colE FROM dbo.my_table WHERE colA = 1 AND colD = 2

查詢第二個(合併)指數會有所幫助(與「可樂」謂語),但該數據庫將仍然有掃描剩餘的結果colD = 2.

另一方面,組合索引將佔用較少的整體空間,並且對A列更新的影響較小,因此您必須權衡權衡。

2

是正確的,與所有列的索引優化,以及兩個獨立的人

不行,絕對不行。更有可能您的查詢需要(colA) INCLUDE (colB, colC, colD, colE)索引,或者colA實際上是一個很好的集羣關鍵人選。這是您呈現的一般情況,無法得出真正的結論。但是,作爲一般規則,不同列上的索引具有不同的角色,並且可以被不同的查詢使用。 (A, B, C)上的索引絕不能代替對(B, C),(B, D)(C, E)上的索引的需要。即使是不同的列順序也不能被替代,(A, B, C)上的索引是不同的,並且不能從(B, C, A)上的索引替代。

我建議你在做其他事情之前先回顧Designing Indexes這個話題。讀完之後,請隨時提出更多問題。

+0

謝謝。我知道索引是一個完整的主題,可以(也應該)在數天內進行研究。我將瀏覽您發佈的Designing Indexes鏈接。 – adinas

2

在回答你的問題時,沒有兩個優化是不相等的。

至於一種方法是否優先於另一種方法,它確實取決於您的查詢是什麼以及如何修改數據。

如果您有關於(ColA,ColB,ColC)的特定where子句和(ColA,ColD,ColE)上的另一個子句的查詢,那麼這兩個索引將很好地服務於該場景。

但是,如果您更新表很多,那麼您將有維護兩個索引的額外開銷。

與這樣的事,你是最好的承接permormance分析和獲得基於預期的訪問模式的指標。

+0

謝謝你的回答。 – adinas