创建包含列的索引

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 添加包含的(或非键)列以扩展 SQL Server 2014 中非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引。 这是因为非键列具有下列优点:

  • 它们可以是不允许作为索引键列的数据类型。

  • 在计算索引键列数或索引键大小时,数据库引擎不考虑它们。

当查询中的所有列都作为键列或非键列包含在索引中时,具有非键列的索引可以显著提高查询性能。 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

注释

索引包含查询引用的所有列时,通常称为 覆盖查询

本主题内容

在您开始之前

设计建议

  • 重新设计索引键大小较大的非聚集索引,以便只有用于搜索和查找的列为键列。 将涵盖查询的所有其他列设为非键列。 这样,将具有覆盖查询所需的所有列,但索引键本身较小,而且效率高。

  • 在非聚集索引中包含非键列,以避免超过最大 16 个键列的当前索引大小限制,最大索引键大小为 900 字节。 数据库引擎计算索引键列数或索引键大小时,不考虑非键列。

局限性与限制

  • 非键列只能在非聚集索引上定义。

  • textntextimage之外的所有数据类型都可以用作非键列。

  • 确定性的计算列,无论其是精确的还是不精确的,都可以是非键列。 有关详细信息,请参阅计算列索引

  • imagentexttext数据类型派生的计算列可以是非键列,只要计算列的数据类型允许作为非键索引列。

  • 除非先删除该表的索引,否则无法从表中删除非键列。

  • 除进行下列更改外,不能对非键列进行其他更改:

    • 将列的为空性从 NOT NULL 改为 NULL。

    • 增加 varcharnvarcharvarbinary 列的长度。

安全

权限

需要对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员或 db_ddladmindb_owner 固定数据库角色的成员。

使用 SQL Server Management Studio

使用非键列创建索引

  1. 在对象资源管理器中,单击加号以展开包含要在其中创建包含非键列索引的表的数据库。

  2. 单击加号以展开 “表” 文件夹。

  3. 单击加号以展开要在其中创建包含非键列的索引的表。

  4. 右键单击 “索引 ”文件夹,指向 “新建索引”,然后选择“ 非聚集索引...”

  5. 在“ 新建索引 ”对话框中的“ 常规 ”页上,在 “索引名称 ”框中输入新索引的名称。

  6. “索引键列 ”选项卡下,单击“ 添加...”

  7. “从table_name中选择列”对话框中,选中要添加到索引的表列的复选框。

  8. 单击 “确定”

  9. “包含的列 ”选项卡下,单击“ 添加...”

  10. 选择列table_name对话框中,选中要作为非键列添加到索引中的一个或多个表列的复选框。

  11. 单击 “确定”

  12. 在“ 新建索引 ”对话框中,单击“ 确定”。

使用 Transact-SQL

创建包含非键列的索引

  1. “对象资源管理器” 中,连接到某个数据库引擎实例。

  2. 在标准栏上,单击“新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击 执行

    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)。