建立內含資料行的索引

除了索引鍵資料行之外,包含非索引鍵資料行將可擴充非叢集索引。非索引鍵資料行是儲存在索引 B 型樹狀目錄的分葉層級。

包含非索引鍵之索引資料行的索引在涵蓋查詢時提供最大的效益。這表示索引包含查詢參考的所有資料行。如需詳細資訊,請參閱<具有內含資料行的索引>。

磁碟空間需求

將無索鍵資料行加入索引將需使用更多的磁碟空間來儲存索引。尤其是,加入 varchar(max)、nvarchar(max)、varbinary(max) 或 xml 資料類型做為非索引鍵之索引資料行將會大幅增加磁碟空間的需求,因為複製到索引分葉層級的資料行值,也同時存在於資料表或叢集索引中。

決定內含資料行索引的磁碟空間需求之處理序,與決定非叢集索引的磁碟空間需求之處理序相同。如需詳細資訊,請參閱<決定索引的磁碟空間需求>。

效能考量

由於查詢最佳化工具可以尋找索引中所有需要的資料行資料,且不會存取資料表或叢集索引,因此可以提升選取作業的效能。然而,太多的內含資料行可能會增加對基礎資料表或索引檢視執行插入、更新或刪除作業時所花費的時間,這是因為索引維護增加之故。

範例

A. 涵蓋查詢

下列範例會在具有四個內含資料行的 Person.Address 資料表上建立非叢集索引。索引鍵資料行為 PostalCode,而非索引鍵之索引資料行則為 AddressLine1, AddressLine2, City, 與 StateProvinceID。

USE AdventureWorks2008R2;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

索引將涵蓋此查詢。

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO

B. 執行索引大小限制

在下列範例中,CREATE INDEX 陳述式的 INCLUDE 子句,是針對通常會超過 900 位元組之最大索引鍵資料行大小限制的資料行建立索引。Production.ProductReview 資料表包含這些資料行:ProductID(int)、ReviewerName(nvarchar (50)) 以及 Comments (nvarchar (3850))。這些資料行通常是用於查詢中,但是 Comments 資料行太大無法做為索引鍵資料行。然而,透過使用 INCLUDE 子句,就可將 Comments 資料行以非索引鍵之索引資料行加入索引。

USE AdventureWorks2008R2;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO

索引將涵蓋此查詢。

SELECT Comments
FROM Production.ProductReview 
WHERE ProductID = 937;
GO

若要建立內含資料行的索引