覆盖查询(coverng query)是指其引用的所有列均能在非聚集索引中找到的查询。这个方案经常会带来出众的查询性能,因为SQL Server不需要从聚集索引或堆中检索实际的数据——它只需要读取在非聚集索引中存储的数据。但是它的缺点是最多只能包含16列或900字节的索引键。
这个问题的一个解决方案是新引入的关键字INCLUDE,它允许添加最多1023个非键列到非聚集索引,通过创建覆盖索引帮助提升查询性能。这些非键列没有存储在索引的所有级别上,而只是存在于非聚集索引的叶级别上。
使用INCLUDE的CREATE NONCLUSTERED INDEX的语法如下:
CREATE NONCLUSTERED INDEX index_name
ON table_or_ view_name(column [ASC l DESC] [,…n ])
INCLUDE(column [,…n])
第一个列列表是键索引列,在INCLUDE之后的列列表是非键列。在这个示例中,将新的大型对象数据类型列添加到TerminationReason表中。删除并重建在DepartmentID上的既有索引,这次添加新的非键值到索引中:
USE AdventureWorks
GO
ALTER TABLE HumanResources.TerminationReason
ADD LegalDescription varchar(max)
DROP INDEX
HumanResources.TerminationReason.NI_TerminationReason_TerminationReason_DepartmentID
CREATE NONCLUSTERED INDEX NI_TerminationReason_TerminationReason_DepartmentID
ON HumanResources.TerminationReason (TerminationReason,DepartMentID)
INCLUDE (LegalDescription)