SQL SERVER 索引優化
——移除鍵查找(書籤查找)或RID查找(二)
前面我已經寫了一篇關於移除鍵查找的文章。這篇文章作爲基礎文章的續,請在繼續閱讀本文之前,先閱讀前面的文章。
我們閱讀了使用覆蓋索引移除鍵查找的文章。覆蓋索引是這樣的一種索引,其包含了SELECT、JOINS、WHERE條件的所有列。在我們的例子中,我們先創建了聚集索引。
-- 創建聚集索引
CREATE CLUSTERED INDEX [IX_OneIndex_ID] ON [dbo].[OneIndex] (
[ID] ASC
);
基於聚集索引,我們創建瞭如下的非聚集索引。請注意,我們沒有必要兩個索引一起創建。我們可以或者創建覆蓋索引,或者創建包含索引。請注意,我建議的是創建其中一個,而不是兩個都創建。
前面的文章中,我建議包含所有列,但實際上,在所有的非聚集索引中,沒有必要包含聚集索引所包含的列。所有非聚集索引自動包含聚集索引的指針。
我們應該像下面一樣創建前篇文章中提到的索引。
方法1:創建覆蓋非聚集索引
CREATE NONCLUSTERED INDEX IX_OneIndex_Cover
ON dbo.OneIndex(City,Firstname)
with(drop_existing=on);
方法2:創建包含非聚集索引
CREATE NONCLUSTERED INDEX IX_OneIndex_Include
ON dbo.OneIndex(City)
INCLUDE(FirstName,ID)
with(drop_existing=on);
注意,方法1、2創建的索引都沒有包含聚集索引使用的ID字段。讓我們來檢查執行計劃,並比較查詢開銷,同時驗證兩個都使用索引查找,而非索引掃描。
像上面案例討論的一樣,非聚集索引不必要包含聚集索引所包含的列。
如果喜歡,可以掃碼關注SQL Server 公衆號,將有更多精彩內容分享: