索引 DDL 操作的磁盘空间要求

创建、重新生成或删除索引时,磁盘空间是一个重要考虑因素。 磁盘空间不足可能会降低性能,甚至会导致索引作失败。 本主题提供一般信息,可帮助你确定索引数据定义语言(DDL)作所需的磁盘空间量。

不需要额外磁盘空间的索引操作

以下索引作不需要额外的磁盘空间:

  • ALTER INDEX REORGANIZE;但是,需要日志空间。

  • 在删除非聚集索引时使用 DROP INDEX。

  • 如果在脱机删除聚集索引时未指定 MOVE TO 子句且不存在非聚集索引,则使用 DROP INDEX。

  • 创建表(主键或唯一约束)

需要额外磁盘空间的索引操作

所有其他的DDL索引操作都需要在操作期间使用额外的临时磁盘空间,以及永久磁盘空间来存储新的索引结构或结构体。

创建新的索引结构后,旧(源)结构和新(目标)结构在其相应的文件或文件组中都需要一定的磁盘空间。 旧的结构只有在提交索引创建事务后才会释放。

以下索引 DDL操作会创建新的索引结构,并需要额外的磁盘空间。

  • 创建索引 (CREATE INDEX)

  • 创建索引并删除现有的

  • ALTER INDEX REBUILD 用于重建索引

  • ALTER TABLE ADD CONSTRAINT (PRIMARY KEY 或 UNIQUE)

  • 执行 ALTER TABLE DROP CONSTRAINT 以删除基于聚集索引的约束(PRIMARY KEY 或 UNIQUE)

  • DROP INDEX MOVE TO (仅适用于聚集索引。

用于排序的临时磁盘空间

除了源结构和目标结构所需的磁盘空间外,除非查询优化器找到不需要排序的执行计划,否则需要临时磁盘空间。

如果需要排序,则一次进行一个新索引的排序。 例如,在单个语句中重新生成聚集索引和关联的非聚集索引时,索引会逐个排序。 因此,排序所需的额外临时磁盘空间必须与操作中最大的索引一样大。 这几乎始终是聚集索引。

如果SORT_IN_TEMPDB选项设置为 ON,最大索引必须适合 tempdb。 尽管此选项会增加用于创建索引的临时磁盘空间量,但当 tempdb 位于不同于用户数据库的一组磁盘上时,可能会缩短创建索引所需的时间。

如果SORT_IN_TEMPDB设置为 OFF(默认值),则每个索引(包括分区索引)在其目标磁盘空间中排序,并且仅需要新索引结构的磁盘空间。

有关计算磁盘空间的示例,请参阅 索引磁盘空间示例

联机索引操作的临时磁盘空间

联机执行索引作时,需要额外的临时磁盘空间。

如果联机创建、重新生成或删除聚集索引,则会创建临时非聚集索引以将旧书签映射到新书签。 如果SORT_IN_TEMPDB选项设置为 ON,则会在 tempdb 中创建此临时索引。 如果SORT_IN_TEMPDB设置为 OFF,则使用与目标索引相同的文件组或分区方案。 临时映射索引包含表中每一行的一条记录,其内容是旧书签列和新书签列的并集,包括唯一化标识符和记录标识符,并且只包含这两个书签中使用的任何列的单个副本。 有关联机索引操作的详细信息,请参阅 执行联机索引操作

注释

无法为 DROP INDEX 语句设置 SORT_IN_TEMPDB 选项。 临时映射索引始终在目标索引所在的同一文件组或分区方案中创建。

联机索引操作使用行版本控制来隔离索引操作免受其他事务修改影响。 这样就无需请求对已读取的行请求共享锁。 联机索引操作期间的并发的用户更新和删除操作需要 tempdb 中的版本记录空间。 有关详细信息,请参阅 在线执行索引操作

索引磁盘空间示例

索引操作的事务日志磁盘空间

估计表的大小

估计聚集索引的大小

估计非聚集索引的大小

估计堆的大小

创建索引(Transact-SQL)

ALTER INDEX (Transact-SQL)

DROP INDEX (Transact-SQL)

为索引指定填充因子

重新组织并重新生成索引