设置索引选项

当设计、创建或修改索引时,要注意一些索引选项。这些选项可以在第一次创建索引或重新生成索引时指定。此外,还可以使用 ALTER INDEX 语句的 SET 子句随时设置一些索引选项。

索引选项

说明

元数据中存储的设置

相关主题

PAD_INDEX

设置创建索引期间中间级别页中可用空间的百分比。

填充因子

FILLFACTOR

设置创建索引期间每个索引页的页级别中可用空间的百分比。

填充因子

SORT_IN_TEMPDB

确定对创建索引期间生成的中间排序结果进行排序的位置。

如果为 ON,则排序结果存储在 tempdb 中。如果为 OFF,则排序结果存储在存储结果索引的文件组或分区方案中。

注意注意
如果不需要排序操作或可以在内存中执行排序,则忽略 SORT_IN_TEMPDB。

tempdb 和索引创建

IGNORE_DUP_KEY

指定在插入操作尝试向唯一索引插入重复键值时的错误响应。IGNORE_DUP_KEY 选项仅适用于创建或重新生成索引后发生的插入操作。默认值为 OFF。

CREATE INDEX

STATISTICS_NORECOMPUTE

指定是否应自动重新计算过期的索引统计信息。

索引统计信息

DROP_EXISTING

指示应删除和重新创建现有索引。

重新组织和重新生成索引

ONLINE

确定是否允许并发用户在索引操作期间访问基础表或聚集索引数据以及任何关联非聚集索引。

注意注意
联机索引操作仅在 SQL Server Developer Edition、Evaluation Edition 和 Enterprise Edition 中可用。

联机执行索引操作

ALLOW_ROW_LOCKS

确定访问索引数据时是否使用行锁。

CREATE INDEX

自定义索引的锁定

ALLOW_PAGE_LOCKS

确定访问索引数据时是否使用页锁。

CREATE INDEX

自定义索引的锁定

MAXDOP

设置查询处理器执行单个索引语句可以使用的最大处理器数。根据当前系统的工作负荷,可以使用较少的处理器。

注意注意
并行索引操作仅在 SQL Server Enterprise Edition、Developer Edition 和 Evaluation Edition 中可用。

修改索引

DATA_COMPRESSION

为指定的表、分区号或分区范围指定数据压缩选项。选项有 NONE、ROW 和 PAGE。

创建压缩表和索引

设置索引上的选项

设置选项但不重新生成

使用 ALTER INDEX 语句中的 SET 子句,可以设置下列索引选项而不重新生成索引:

  • ALLOW_PAGE_LOCKS

  • ALLOW_ROW_LOCKS

  • IGNORE_DUP_KEY

  • STATISTICS_NORECOMPUTE

上面这些选项立即应用于索引。只有在创建或重新生成索引时,才可以指定其他索引选项(如 FILLFACTOR 和 ONLINE)。

查看索引选项设置

并不是所有索引选项值都存储在元数据中。存储在元数据中的那些值可以在相应的目录视图中查看。若要检查现有索引的当前选项设置,请使用 sys.indexes 目录视图。若要检查 STATISTICS_NORECOMPUTE 的当前值,请使用 sys.stats 目录视图。有关详细信息,请参阅查看索引信息

示例

下面的示例对 Production.Product 表中的 AK_Product_ProductNumber 索引设置了 ALLOW_ROW_LOCKS 和 IGNORE_DUP_KEY 选项。

USE AdventureWorks;
GO
--Verify the current values for these options.
SELECT allow_row_locks, ignore_dup_key
FROM sys.indexes 
WHERE name = N'AK_Product_ProductNumber';
GO
--Set the ALLOW_ROW_LOCKS option OFF and the IGNORE_DUP_KEY option ON.
ALTER INDEX AK_Product_ProductNumber       
ON Production.Product       
SET (ALLOW_ROW_LOCKS = OFF, IGNORE_DUP_KEY = ON);
GO
--Verify the new values for these options.
SELECT allow_row_locks, ignore_dup_key
FROM sys.indexes 
WHERE name = N'AK_Product_ProductNumber';
GO