创建带有包含性列的索引

在 SQL Server 2005 中,可以通过包含索引键列和非键列来扩展非聚集索引。非键列存储在索引 B 树的叶级别。

包含非键列的索引在它们包含查询时可提供最大的好处。这意味着索引包含查询引用的所有列。有关详细信息,请参阅具有包含性列的索引

磁盘空间要求

将非键列添加到索引中要使用更多的空间来存储索引。特别是,将 varchar(max)nvarchar(max)varbinary(max)xml 数据类型添加为非键列会显著增加磁盘空间要求,因为列值被复制到索引的叶级别中,同时还保留在表或聚集索引中。

确定带有包含性列的索引的磁盘空间要求的过程与非聚集索引一样。有关信息,请参阅确定索引的磁盘空间要求

性能注意事项

这样可以提高选择操作的性能,因为查询优化器可以在索引中找到需要的所有列数据,而不用访问表或聚集索引。但是,拥有太多的包含性列会增加对基础表或索引视图执行插入、更新或删除等操作所需的时间,因为增加了索引维护的工作量。

示例

A. 包含一个查询

以下示例在带有四个包含性列的 Person.Address 表上创建了一个非聚集索引。索引键列是 PostalCode,非键列是 AddressLine1, AddressLine2, City,StateProvinceID

USE AdventureWorks;
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 AdventureWorks;
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
创建带有包含性列的索引

CREATE INDEX (Transact-SQL)

请参阅

概念

创建非聚集索引
常规索引设计指南

帮助和信息

获取 SQL Server 2005 帮助