SQL Server索引--(包含列和覆蓋索引)


     一、覆蓋索引

       如果所構建的查詢只需訪問索引中的數據即可滿足查詢的需求,那便無需訪問數據表。  一個可以滿足查詢全部需求的索引被稱為“覆蓋索引”(covering index)。

       可以在一個給定的查詢中使用多個索引。如果兩個索引中至少有一列是相同的,則SQL Server能將兩個索引聯在一起以滿足查詢的需求。

       數據庫中有索引是一件好事,而覆蓋索引更為查詢提供了極好的值。 但是,也受限制於每個索引至多16列、900字節的約束。該限制排除了大數據類型列使用覆蓋索引的可能性,否則即使針對這類值得查詢也可以不從基礎表中抽取數據。

      當查詢中的所有列都作為鍵列或非鍵列包含在索引中時,帶有包含性非鍵列的索引可以顯著提高查詢性能。這樣可以實現性能提升,因為查詢優化器可以在索引中找到所有列值;不訪問表或聚集索引數據,從而減少磁盤 I/O 操作。當索引包含查詢引用的所有列時,它通常稱為“覆蓋查詢”。

       二、包含列

        SQL Server 2005引入了一項新的索引特性,即所謂的包含列(included column)。包含列僅在葉節點層級上成為索引的一部分。來自包含列的值不會出現在索引的根節點或中間級內,且不計入900字節的限制。 您可以通過將非鍵列添加到非聚集索引的葉級,擴展非聚集索引的功能。通過包含非鍵列,可以創建覆蓋更多查詢的非聚集索引。這是因為非鍵列具有下列優點:

1.它們可以是不允許作為索引鍵列的數據類型。

2.在計算索引鍵列數或索引鍵大小時,數據庫引擎不考慮它們。

       三、列大小准則

1.必須至少定義一個鍵列。最大非鍵列數為 1023 列。也就是最大的表列數減 1。

2.索引鍵列(不包括非鍵)必須遵守現有索引大小的限制(最大鍵列數為 16,總索引鍵大小為 900 字節)。

3.所有非鍵列的總大小只受 INCLUDE 子句中所指定列的大小限制;例如,varchar(max) 列限制為 2 GB。

       四、設計建議

        重新設計索引鍵大小較大的非聚集索引,以便只有用於搜索和查找的列為鍵列。將覆蓋查詢的所有其他列設置為包含性非鍵列。這樣,將具有覆蓋查詢所需的所有列,但索引鍵本身較小,而且效率高。例如,假設要設計覆蓋下列查詢的索引。

1 USE AdventureWorks;
2 GO
3 SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
4 FROM Person.Address
5 WHERE PostalCode BETWEEN N'98000' and N'99999';
        覆蓋查詢必須在索引中定義每列。盡管可以將所有列定義為鍵列,但鍵大小為 334 字節( AddressLine1 nvarchar(60), AddressLine2 nvarchar(60), City nvarchar(30), StateProvinceID int, PostalCode nvarchar(15) )。因為實際上用作搜索條件的唯一列是 PostalCode 列(長度為 30 字節),所以更好的索引設計應該將 PostalCode 定義為鍵列並包含作為非鍵列的所有其他列。 下面的語句創建了一個覆蓋查詢的帶有包含列的索引。
1 USE AdventureWorks;
2 GO
3 CREATE INDEX IX_Address_PostalCode
4 ON Person.Address (PostalCode)
5 INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM