适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
磁盘空间是创建、重新生成或删除索引时所需考虑的重要因素。 磁盘空间不足会降低性能,甚至导致索引操作失败。 本文提供一般信息,可帮助你确定索引数据定义语言(DDL)作所需的磁盘空间量。
不需要额外磁盘空间的索引操作
以下索引操作不需要额外的磁盘空间:
ALTER INDEX REORGANIZE;但是,需要日志空间。DROP INDEX删除非聚集索引时。DROP INDEX在不指定MOVE TO子句的情况下脱机删除聚集索引时,不存在非聚集索引。CREATE TABLE(PRIMARY KEY或UNIQUE约束)
需要额外磁盘空间的索引操作
其他所有 DDL 操作都需要在操作期间使用额外的临时磁盘空间,并需要永久磁盘空间来存储新的索引结构。
创建新的索引结构后,旧(源)结构和新(目标)结构在其相应的文件或文件组中都需要一定的磁盘空间。 在索引创建事务提交之前,旧结构不会解除分配。
以下索引 DDL 操作将创建新的索引结构并需要额外的磁盘空间:
CREATE INDEXCREATE INDEX WITH DROP_EXISTINGALTER 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,则使用与目标索引相同的文件组或分区方案。 临时映射索引针对表中的每行包含一个记录,其内容为新旧书签列,其中包括 uniqueifier 和记录标识符,并且仅包括两种书签中使用的任何列的单个副本。 有关联机索引操作的详细信息,请参阅 在线执行索引操作。
注意
SORT_IN_TEMPDB不能为DROP INDEX语句设置选项。 临时映射索引始终与目标索引创建在同一文件组或分区方案中。
联机索引操作使用行版本控制来使索引操作不受其他事务所做的修改的影响。 这就不需要对已经读取的行请求共享锁。 联机索引操作期间,并发用户更新和删除操作需要存储版本记录的空间 tempdb。 有关详细信息,请参阅 在线执行索引操作。