2012-12-04 90 views
1

我已經根據索引向導針對不同場景建議的方式創建了這兩個索引。 我在想,如果他們是相同的還是他們不同?SQL Server中這兩個索引之間的區別是什麼?

指數(1):

CREATE NONClustered Index [IX_Rec_RecoveryDate_RecoveryDateTypeKey_CaseId] 
ON [Rec].[RecoveryDate] ([RecoveryDateTypeKey], [CurrentFlag]) 
INCLUDE (CaseId) 

指數(2):

CREATE NONClustered Index [IX_Rec_RecoveryDate_currentFlag] 
ON [Rec].[RecoveryDate] ([CurrentFlag]) 
INCLUDE (CaseId, RecoveryDateTypekey) 

回答

4

問題是,您試圖優化哪些查詢?

這兩個指標有很大不同。第一個索引對於像這樣的查詢是很好的:

SELECT CaseId 
FROM Rec.RecoveryDate 
WHERE RecoveryTypeKey = 5 
AND CurrentFlag = 1 -- or whatever 

第一個索引WHERE子句中的列。 SQL Server將能夠搜索指定的RecoveryDateTypeKey和CurrentFlag。由於CaseId在索引葉節點中包含INCLUDEd,因此SQL Server無需重新連接到表即可獲取它。

使用相同的查詢,第二個索引將表現不同。如果幸運的話,SQL Server將搜索CurrentFlag爲1的所有記錄。然後,它將遍歷這些葉節點以查找匹配的RecoveryTypeKey。另一方面,如果CurrentFlag爲1的記錄數很多,則SQL Server可能會選擇執行索引掃描。

話又說回來,如果你是想優化這樣的查詢:

SELECT CaseId, RecoveryTypeKey 
FROM Rec.RecoveryDate 
WHERE CurrentFlag = 1 

第一個指數是無用的,因爲CurrentFlag是在索引的第二列。 SQL Server將無法搜索CurrentFlag = 1,因此它可能會執行索引掃描。

+0

感謝您的回答! – Jaxidian

2

它們是不同的。索引1索引兩列,索引2索引一列,但在節點中包含兩列。

的差別基本上意味着,如果你搜索使用的兩列,索引1可能比指數快得多2.
指數2會比一列普通索引更好,因爲如果你需要其它列在你的結果中,索引2已經有了值,所以不需要查找實際的表。

0

索引存儲相同的信息(Recovery表中的每行有1行,列中有caseid,RecoveryDateTypeKey,CurrentFlag),但按不同的順序組織,因此可用於不同的查詢。

第一索引可以處理where子句如

WHERE RecoveryDateTypeKey = @p1 --Prefix matching! 

WHERE RecoveryDateTypeKey = @p1 AND CurrentFlag = @p2 

第二索引只處理

WHERE CurrentFlag = @p2 

如果CurrentFlag是低基數柱諸如位或char(1)(Y/N),那麼我建議過濾索引。

CREATE INDEX IX_REC_Yes_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'Y') 
INCLUDE (CaseId) --Assumes that CurrentFlag = 'Y' is the most used value 

--Maybe even a second one. 
CREATE INDEX IX_REC_No_fltr on Recovery (RecoveryDateTypeKey) WHERE (CurrentFlag = 'N') 
INCLUDE (CaseId) --Maybe handle CurrentFlag = 'N' as well. 

每個篩選索引僅包含滿足標準值,這樣組合時,它們的尺寸與未過濾的索引相同。

相關問題