适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
无论什么时候创建、重新生成或删除索引,在相应的文件和文件组中都需要用于存储旧(源)结构和新(目标)结构的磁盘空间。 在索引创建事务提交之前,旧结构不会解除分配。 可能还需要其他临时磁盘空间用于排序作。 有关详细信息,请参阅索引 DDL 操作的磁盘空间要求。
在本示例中,将确定创建聚集索引需要的磁盘空间。
创建聚集索引之前假定满足以下条件:
- 现有表(堆)包含 100 万行。 每行长度为 200 字节。
- 非聚集索引 A 包含 100 万行。 每行长度为 50 字节。
- 非聚集索引 B 包含 100 万行。 每行长度为 80 字节。
- index create memory 选项设置为 2 MB。
- 所有现有索引和新索引都使用填充因子值 80。 这意味着页的 80% 是满的。
注意
由于创建了聚集索引,必须重新生成这两个非聚集索引来用新聚集索引键替换行指示器。
脱机索引操作的磁盘空间计算
在以下步骤中,将计算在索引操作期间使用的临时磁盘空间和用于存储新索引的永久磁盘空间。 显示的计算是近似的;结果将向上舍入而且仅考虑索引叶级别的大小。 代字号 (~) 用来表示近似计算。
确定源结构的大小。
- 堆:100万 * 200字节 约 200 MB
- 非聚集索引 A:100 万 * 50 字节/80% ~ 63 MB
- 非聚集索引 B:100 万 * 80 字节/80% ~ 100 MB
现有结构的总大小:363 MB
确定目标索引结构的大小。 假定新聚集键为 24 字节长(包含一个 uniqueifier)。 两个非聚集索引的行指示器(8 字节长)将由此聚集键替换。
聚集索引:100 万 * 200 字节/80% ~ 250 MB
非聚集索引 A:100 万 * (50 - 8 + 24) 字节/ 80% ~ 83 MB
非聚集索引 B:100 万 * (80 - 8 + 24) 字节/ 80% ~ 120 MB
新结构的总大小:453 MB
在索引作期间支持源和目标结构所需的总磁盘空间为 816 MB(363 + 453)。 索引操作提交后将释放当前分配给源结构的空间。
确定用于排序的附加临时磁盘空间。
在
tempdb中排序(设置为SORT_IN_TEMPDB)和在目标位置排序(设置为SORT_IN_TEMPDB)时的空间要求显示为ON和OFF。如果
SORT_IN_TEMPDB设置为ON,tempdb则必须有足够的磁盘空间来容纳最大索引(100 万 * 200 字节 ~ 200 MB)。 在排序操作中不考虑填充因子。其他磁盘空间(位于
tempdb位置)等于 索引创建内存 值 = 2 MB。临时磁盘空间
SORT_IN_TEMPDB的总大小设置为ON约 202 MB。如果
SORT_IN_TEMPDB设置为OFF(默认值),则步骤 2 中已为新索引考虑的 250 MB 磁盘空间用于排序。其他磁盘空间(在目标位置)等于 索引创建内存 值 = 2 MB。
临时磁盘空间
SORT_IN_TEMPDB的总大小设置为OFF= 2 MB。
使用 tempdb时,需要总共 1018 MB(816 + 202)来创建聚集索引和非聚集索引。 尽管使用 tempdb 会增加用于创建索引的临时磁盘空间量,但在与用户数据库不同的磁盘集上创建索引时 tempdb ,可能会缩短创建索引所需的时间。 有关使用 tempdb的详细信息,请参阅 索引SORT_IN_TEMPDB选项。
如果不使用 tempdb,则需要总共 818 MB(816 + 2)来创建聚集索引和非聚集索引。
在线聚集索引操作的磁盘空间计算
联机创建、删除或重新生成聚集索引时,将需要附加磁盘空间以生成和维护临时映射索引。 此临时映射索引包含表中每行的一条记录,其内容包含新旧书签列。
若要计算联机聚集索引操作所需的磁盘空间,请按照脱机索引操作显示的步骤操作并将结果添加到以下步骤的结果中。
确定临时映射索引的空间。
在此示例中,旧书签是堆的行 ID (RID)(8 字节),新书签是聚集键(24 字节,包含一个 uniqueifier)。 在新旧书签之间没有重叠的列。
临时映射索引大小 = 1 百万 * (8 字节 + 24 字节) / 80% ~ 40 MB。
必须将此磁盘空间添加到目标位置中所需的磁盘空间,如果
SORT_IN_TEMPDB设置为OFF或SORT_IN_TEMPDB设置为ON,则添加到tempdb中。
有关索引的临时映射的详细信息,请参阅 索引 DDL 操作的磁盘空间要求。
磁盘空间摘要
下表汇总了磁盘空间计算的结果。
| 索引操作 | 以下结构的位置所需的磁盘空间 |
|---|---|
使用SORT_IN_TEMPDB = ON的脱机索引操作 |
操作期间的总空间:1,018 MB - 现有表和索引:363 MB 1 - tempdb:202 MB 1- 新索引:453 MB 操作后所需的总空间大小:453 MB |
使用SORT_IN_TEMPDB = OFF 的离线索引操作 |
操作期间的总空间大小:816 MB - 现有表和索引:363 MB 1 - 新索引:453 MB 操作后所需的总空间大小:453 MB |
使用 SORT_IN_TEMPDB = ON 联机索引操作 |
操作期间的总空间:1,058 MB - 现有表和索引:363 MB 1 - tempdb (包括映射索引):242 MB*- 新索引:453 MB 操作后所需的总空间大小:453 MB |
使用 SORT_IN_TEMPDB = OFF 联机索引操作 |
操作期间的总空间大小:856 MB - 现有表和索引:363 MB 1 - 临时映射索引:40 MB 1 - 新索引:453 MB 操作后所需的总空间大小:453 MB |
1 索引操作提交后,此空间会被释放。
此示例不考虑由并发用户更新和删除操作所创建的版本记录在tempdb所需的任何额外临时磁盘空间。