SQL Server 索引優化——重複索引(部分重複)

SQL Server 索引優化——重複索引(部分重複)

前文給出了查詢完全重複索引方法,但更多的情況下,是多個管理員,根據單個或部分查詢,創建其各自需要的索引,而沒有考慮整體情形,就會出現大量的部分重複索引,這對OLAP來說沒有較大的影響,但對於OLTP系統,頻繁的數據變更就會造成大量的性能消耗,同時也會增加存儲的壓力。所以對於這部分的索引的優化也顯得非常有重要。我們可以這樣理解部分重複索引,即同一列(或列集,不包含聚集索引的鍵列)在不同索引的第一鍵列(第二、第三……)中重複出現,其他部分不同。部分重複索引的構成比較複雜,沒有辦法給出統一腳本,只能通過一個個簡單的例子進行說明。

先創建測試表,腳本如下:

CREATE TABLE Member
(
       MemberNo INT IDENTITY,
       FirstName VARCHAR(30) NOT NULL,
       LastName VARCHAR(30) NOT NULL,
       RegionNo INT
);

爲說明這個問題,下面考慮兩個查詢,並單獨創建各自需要的索引。

SELECT
       LastName
FROM Member
WHERE FirstName='jack';
CREATE INDEX MemberIndex1
ON Member(FirstName)
INCLUDE(LastName);
GO

CREATE INDEX MemberIndex2
ON Member(FirstName)
INCLUDE(RegionNo);
GO
SELECT
       RegionNo
FROM Member
WHERE FirstName='jack';

可以看到MemberIndex1、MemberIndex2的鍵列均爲FirstName,而前者的包含列爲LastName,後者的包含列爲RegionNo。因爲包含列中的順序不會影響查詢優化器對索引的使用,所以可以這樣消除重複索引,我們刪除索引MemberIndex2,重建索引MemberIndex1,包含列同時包含原兩個索引包含列中的LastName和RegionNo,腳本如下:

DROP INDEX Member.MemberIndex2;
CREATE INDEX MemberIndex1 ON Member(FirstName)
INCLUDE(LastName,RegionNo)
WITH (DROP_EXISTING=ON);

重建索引後,再次執行兩個查詢,查看它們的執行計劃如下:

可以看到兩個查詢都使用新的索引進行索引查找。這樣我們節省了一個索引維護的開銷,同時減少了索引中重複字段的存儲空間。

部分重複索引可能不盡相同,如有興趣,歡迎討論。

如果喜歡,可以搜索關注 MSSQLServer 公衆號,將有更多精彩內容分享:

                                                                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章