创建非聚集索引

可以对表或索引视图创建多个非聚集索引。通常,创建非聚集索引是为了提高聚集索引未包含的常用查询的性能。

典型实现

可以通过下列方法实现非聚集索引:

  • PRIMARY KEY 和 UNIQUE 约束

    在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。主键列不允许空值。

    在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。如果不存在该表的聚集索引,则可以指定唯一聚集索引。有关详细信息,请参阅 PRIMARY KEY 约束UNIQUE 约束

  • 独立于约束的索引

    默认情况下,如果未指定聚集,将创建非聚集索引。对于每个表可创建的最大非聚集索引数为 999。这包括使用 PRIMARY KEY 或 UNIQUE 约束创建的任何索引,但不包括 XML 或空间索引。

  • 索引视图的非聚集索引

    对视图创建唯一的聚集索引后,便可以创建非聚集索引。有关详细信息,请参阅创建索引视图

具有包含列的索引

当创建非聚集索引以包含某个查询时,可以在索引定义中包含非键列,以包含查询中未用作主搜索列的那些列。这样可以提高性能,因为查询优化器可以在索引中找到需要的所有列数据,而不用访问表或聚集索引。有关详细信息,请参阅具有包含列的索引

具有筛选谓词的索引

筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。筛选索引使用筛选谓词对表中的部分行进行索引。与全表索引相比,设计良好的筛选索引可以提高查询性能、减少索引维护开销并可降低索引存储开销。

有关详细信息,请参阅筛选索引设计准则

磁盘空间要求

有关非聚集索引的磁盘空间要求的信息,请参阅确定索引的磁盘空间要求

性能注意事项

尽管在索引中包含查询使用的所有列这一点很重要,但要避免添加不必要的列。添加太多的索引列(键列或非键列)可能会导致下列性能后果:

  • 一页上容纳的索引行减少,导致磁盘 I/O 增加,而缓冲效率降低。

  • 需要更多的磁盘空间来存储索引。

  • 索引维护可能增加对基础表或索引视图执行修改、插入、更新、删除或合并等操作所需的时间。

您应确定查询性能的提高是否超过修改数据时对性能的影响,以及是否产生了额外的磁盘空间要求。有关评估查询性能的详细信息,请参阅查询优化

当表数据具有定义完善的行子集的列(如稀疏列、大部分值为 NULL 的列、具有各种类别的值的列以及具有截然不同的值范围的列)时,可考虑使用筛选索引以提高性能。有关详细信息,请参阅筛选索引设计准则

在创建表时创建 PRIMARY KEY 或 UNIQUE 约束

CREATE TABLE (Transact-SQL)

对现有表创建 PRIMARY KEY 或 UNIQUE 约束

ALTER TABLE (Transact-SQL)

创建索引

CREATE INDEX (Transact-SQL)