一、覆蓋索引
如果所構建的查詢只需訪問索引中的數據即可滿足查詢的需求,那便無需訪問數據表。 一個可以滿足查詢全部需求的索引被稱為“覆蓋索引”(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';
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);
