创建索引(数据库引擎)

本主题说明了主要索引创建任务,并提供了创建索引之前要了解的实现和执行指南。

索引创建任务

下列任务组成了创建索引的建议策略:

  1. 设计索引。

    索引设计是一项关键任务。索引设计包括确定要使用的列,选择索引类型(例如聚集或非聚集),选择适当的索引选项,以及确定文件组或分区方案布置。有关详细信息,请参阅设计索引

  2. 确定最佳的创建方法。按照以下方法创建索引:

    • 使用 CREATE TABLE 或 ALTER TABLE 对列定义 PRIMARY KEY 或 UNIQUE 约束

      SQL Server 数据库引擎自动创建唯一索引来强制 PRIMARY KEY 或 UNIQUE 约束的唯一性要求。默认情况下,创建的唯一聚集索引可以强制 PRIMARY KEY 约束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默认情况下,创建的唯一非聚集索引可以强制 UNIQUE 约束,除非已明确指定唯一的聚集索引且表中不存在聚集索引。

      还可以指定索引选项和索引位置、文件组或分区方案。

      创建为 PRIMARY KEY 或 UNIQUE 约束的一部分的索引将自动给定与约束名称相同的名称。有关详细信息,请参阅 PRIMARY KEY 约束UNIQUE 约束

    • 使用 CREATE INDEX 语句或 SQL Server Management Studio 对象资源管理器中的**“新建索引”**对话框创建独立于约束的索引

      必须指定索引的名称、表以及应用该索引的列。还可以指定索引选项和索引位置、文件组或分区方案。默认情况下,如果未指定聚集或唯一选项,将创建非聚集的非唯一索引。若要创建筛选索引,请使用可选的 WHERE 子句。有关详细信息,请参阅筛选索引设计准则

  3. 创建索引。

    要考虑的一个重要因素是对空表还是对包含数据的表创建索引。对空表创建索引在创建索引时不会对性能产生任何影响,而向表中添加数据时,会对性能产生影响。

    对大型表创建索引时应仔细计划,这样才不会影响数据库性能。对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。在对现有表创建索引时,请考虑将 ONLINE 选项设置为 ON。该选项设置为 ON 时,将不持有长期表锁以继续对基础表的查询或更新。有关详细信息,请参阅联机执行索引操作

实现注意事项

下表列出了适用于聚集索引、非聚集索引、空间索引、筛选索引和 XML 索引的最大值。除非另有指定,否则下列限制应用于所有索引类型。

最大索引限制

其他信息

每个表的聚集索引数

1

 

每个表的非聚集索引数

999

包括筛选索引和使用 PRIMARY KEY 或 UNIQUE 约束创建的非聚集索引,但不包括 XML 索引。

每个表的 XML 索引数

249

包括 xml 数据类型列的主 XML 索引和辅助 XML 索引。

XML 数据类型列的索引

每个表的空间索引

249

使用空间索引(数据库引擎)

每个索引的键列数

16*

如果表中还包含主 XML 索引或空间索引,则聚集索引不得超过 15 列。

索引键的最大大小.

索引键记录大小

900 字节*

不适用于 XML 索引或空间索引。

为了使表支持空间索引,最大索引键记录大小应当为 895 个字节。

索引键的最大大小.

* 通过在索引中包含非键列可以避免受非聚集索引的索引键列和记录大小的限制。有关详细信息,请参阅具有包含列的索引

数据类型

通常,可以对表或视图中的任何列创建索引。下表列出了限制索引参与的数据类型。

数据类型

索引参与

其他信息

CLR 用户定义类型

如果类型支持二进制顺序,则可以进行索引。

使用 CLR 用户定义类型

大型对象 (LOB) 数据类型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 和 xml

不能作为索引键列。但是,XML 列可以作为表中的主 XML 索引或辅助 XML 索引的键列。

可以作为非键(包含性)列参与非聚集索引,image、ntext 和 text 除外。

如果是计算列表达式的一部分,则可以参与。

具有包含列的索引

XML 数据类型列的索引

计算列

可以进行索引。这包括定义为 CLR 用户定义类型列的方法调用的计算列,条件是方法被标记为确定性。

只要允许计算列数据类型作为索引键列或索引非键列,就可以将从 LOB 数据类型派生的计算列索引为键列或非键列。

为计算列创建索引

推送到行外的 Varchar 列

聚集索引的索引键不能包含在ROW_OVERFLOW_DATA 分配单元中具有现有数据的 varchar 列。如果对 varchar 列创建了聚集索引,并且在 IN_ROW_DATA 分配单元中存在现有数据,则对该列执行的将数据推送到行外的后续插入或更新操作将会失败。

表组织和索引组织

行溢出数据超过 8 KB

geometry

可以使用多个空间索引来编制索引。

空间数据类型

其他注意事项

下面是创建索引时需要注意的一些其他事项:

  • 如果对表具有 CONTROL 或 ALTER 权限,则可以创建索引。

  • 创建索引后,索引将自动启用并可以使用。可以通过禁用索引来删除对该索引的访问。有关详细信息,请参阅禁用索引

磁盘空间要求

存储索引所需的磁盘空间量取决于下列因素:

性能注意事项

实际创建索引所需的时间在很大程度上取决于磁盘子系统。下面是需要考虑的重要因素:

  • 数据库的恢复模式。与完整恢复模式相比,大容量日志恢复模式的性能更高,并且减少了索引创建操作过程中占用的日志空间。但是,大容量日志恢复会降低时点恢复的灵活性。有关详细信息,请参阅为索引操作选择恢复模式

  • 用于存储数据库和事务日志文件的 RAID(独立磁盘冗余阵列)级别。通常,使用条带化的 RAID 级别将具有更好的 I/O 带宽。

  • 磁盘阵列中的磁盘数(如果使用了 RAID)。阵列中的驱动器越多就会按比例增加数据传输速率。

  • 存储数据中间排序进程的位置。tempdb 与用户数据库位于一组不同的磁盘上时,使用 SORT_IN_TEMPDB 选项可以减少创建索引所需的时间。有关详细信息,请参阅 tempdb 和索引创建

  • 脱机或联机创建索引。

    脱机(默认设置)创建索引时,直到创建索引事务完成后,才释放基础表的排他锁。在创建索引时,用户不可以访问表。

    可以指定以联机方式创建索引,但 XML 索引和空间索引除外。联机选项设置为 ON 时,在创建索引的过程中,将不持有长期表锁,从而使基础表的查询或更新可继续。虽然建议联机执行索引操作,但您应该对环境和特定要求进行评估。脱机运行索引操作可能比较好。这样做,用户在操作过程中对数据具有有限的访问权限,但操作会完成得更快且使用的资源更少。有关详细信息,请参阅联机执行索引操作

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

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

创建索引

更改历史记录

更新的内容

已将非聚集索引限制更新为 999。