本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 添加包含的(或非键)列以扩展 SQL Server 2014 中非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引。 这是因为非键列具有下列优点:
它们可以是不允许作为索引键列的数据类型。
在计算索引键列数或索引键大小时,数据库引擎不考虑它们。
当查询中的所有列都作为键列或非键列包含在索引中时,具有非键列的索引可以显著提高查询性能。 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。
注释
索引包含查询引用的所有列时,通常称为 覆盖查询。
本主题内容
准备工作:
若要创建包含非键列的索引,请使用:
在您开始之前
设计建议
重新设计索引键大小较大的非聚集索引,以便只有用于搜索和查找的列为键列。 将涵盖查询的所有其他列设为非键列。 这样,将具有覆盖查询所需的所有列,但索引键本身较小,而且效率高。
在非聚集索引中包含非键列,以避免超过最大 16 个键列的当前索引大小限制,最大索引键大小为 900 字节。 数据库引擎计算索引键列数或索引键大小时,不考虑非键列。
局限性与限制
非键列只能在非聚集索引上定义。
除
text
、ntext
和image
之外的所有数据类型都可以用作非键列。确定性的计算列,无论其是精确的还是不精确的,都可以是非键列。 有关详细信息,请参阅计算列索引。
从
image
、ntext
和text
数据类型派生的计算列可以是非键列,只要计算列的数据类型允许作为非键索引列。除非先删除该表的索引,否则无法从表中删除非键列。
除进行下列更改外,不能对非键列进行其他更改:
将列的为空性从 NOT NULL 改为 NULL。
增加
varchar
、nvarchar
或varbinary
列的长度。
安全
权限
需要对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员或 db_ddladmin 和 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio
使用非键列创建索引
在对象资源管理器中,单击加号以展开包含要在其中创建包含非键列索引的表的数据库。
单击加号以展开 “表” 文件夹。
单击加号以展开要在其中创建包含非键列的索引的表。
右键单击 “索引 ”文件夹,指向 “新建索引”,然后选择“ 非聚集索引...”。
在“ 新建索引 ”对话框中的“ 常规 ”页上,在 “索引名称 ”框中输入新索引的名称。
在 “索引键列 ”选项卡下,单击“ 添加...”。
在“从table_name中选择列”对话框中,选中要添加到索引的表列的复选框。
单击 “确定” 。
在 “包含的列 ”选项卡下,单击“ 添加...”。
在选择列从table_name对话框中,选中要作为非键列添加到索引中的一个或多个表列的复选框。
单击 “确定” 。
在“ 新建索引 ”对话框中,单击“ 确定”。
使用 Transact-SQL
创建包含非键列的索引
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。
USE AdventureWorks2012; GO -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns. -- index key column is PostalCode and the nonkey columns are -- AddressLine1, AddressLine2, City, and StateProvinceID. CREATE NONCLUSTERED INDEX IX_Address_PostalCode ON Person.Address (PostalCode) INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); GO
有关详细信息,请参阅 CREATE INDEX(Transact-SQL)。