索引磁盘空间示例

无论什么时候创建、重新生成或删除索引,在相应的文件和文件组中都需要用于存储旧(源)结构和新(目标)结构的磁盘空间。旧的结构只有在提交索引创建事务后才会释放。还可能需要附加临时磁盘空间以进行排序操作。有关详细信息,请参阅索引 DDL 操作的磁盘空间要求

在本示例中,将确定创建聚集索引需要的磁盘空间。

创建聚集索引之前假定满足以下条件:

  • 现有表(堆)包含 100 万行。每行长度为 200 字节。

  • 非聚集索引 A 包含 100 万行。每行长度为 50 字节。

  • 非聚集索引 B 包含 100 万行。每行长度为 80 字节。

  • index create memory 选项设置为 2 MB。

  • 所有现有索引和新索引都使用填充因子值 80。这意味着页的 80% 是满的。

    注意注意

    由于创建了聚集索引,必须重新生成这两个非聚集索引来用新聚集索引键替换行指示器。

脱机索引操作所用的磁盘空间计算

在以下步骤中,将计算在索引操作期间使用的临时磁盘空间和用于存储新索引的永久磁盘空间。显示的计算是近似的:结果将向上舍入而且仅考虑索引叶级别的大小。代字号 (~) 用来表示近似计算。

  1. 确定现有(源)结构的大小。

    堆:100 万 * 200 字节 ~ 200 MB

    非聚集索引 A:1 百万 * 50 字节 / 80% ~ 63 MB

    非聚集索引 B:1 百万 * 80 字节 / 80% ~ 100 MB

    现有结构的总大小:363 MB

  2. 确定新(目标)索引结构的大小。假定新聚集键为 24 字节长(包含一个 uniqueifier)。两个非聚集索引的行指示器(8 字节长)将由此聚集键替换。

    聚集索引:1 百万 * 200 字节 / 80% ~ 250 MB

    非聚集索引 A:1 百万 * (50 – 8 + 24) 字节 / 80% ~ 83 MB

    非聚集索引 B:1 百万 * (80 – 8 + 24) 字节 / 80% ~ 120 MB

    新结构的总大小:453 MB

    索引操作期间支持源结构和目标结构所需的总磁盘空间为 816 MB (363 + 453)。索引操作提交后将释放当前分配给源结构的空间。

  3. 确定用于排序的附加临时磁盘空间。

    将显示在 tempdb 中排序所用的空间(其中 SORT_IN_TEMPDB 设置为 ON)和在目标位置排序所用的空间(其中 SORT_IN_TEMPDB 设置为 OFF)。

    1. SORT_IN_TEMPDB 设置为 ON 时,tempdb 必须有足够磁盘空间以容纳最大的索引(1 百万 * 200 字节 ~ 200 MB)。在排序操作中没有考虑填充因子。

      index create memory 选项值 = 2 MB,附加磁盘空间(在 tempdb 位置)与其相同。

      将 SORT_IN_TEMPDB 设置为 ON 时临时磁盘空间的总大小 ~ 202 MB。

    2. SORT_IN_TEMPDB 设置为 OFF(默认值)时,步骤 2 中用于新索引的 250 MB 磁盘空间将用于排序。

      index create memory 选项值 = 2 MB,附加磁盘空间(在目标位置)与其相同。

      将 SORT_IN_TEMPDB 设置为 OFF 时临时磁盘空间的总大小 = 2 MB。

使用 tempdb 时,将一共需要 1018 MB (816 + 202) 来创建聚集索引和非聚集索引。虽然使用 tempdb 增加了用于创建索引的临时磁盘空间量,但是当 tempdb 与用户数据库位于不同的磁盘集上时,它可以减少创建索引所需的时间。有关使用 tempdb 的详细信息,请参阅 tempdb 和索引创建

不使用 tempdb 时,将一共需要 818 MB (816 + 2) 来创建聚集索引和非聚集索引。

联机聚集索引操作所用的磁盘空间计算

联机创建、删除或重新生成聚集索引时,将需要附加磁盘空间以生成和维护临时映射索引。此临时映射索引包含表中每行的一条记录,其内容包含新旧书签列。

若要计算联机聚集索引操作所需的磁盘空间,请按照脱机索引操作显示的步骤操作并将结果添加到以下步骤的结果中。

  • 确定临时映射索引的空间。

    在此示例中,旧书签是堆的行 ID (RID)(8 字节),新书签是聚集键(24 字节,包含一个 uniqueifier)。在新旧书签之间没有重叠的列。

    临时映射索引大小 = 1 百万 * (8 字节 + 24 字节) / 80% ~ 40 MB。

    必须将此磁盘空间添加到目标位置所需磁盘空间(如果 SORT_IN_TEMPDB 设置为 OFF),或添加到 tempdb(如果 SORT_IN_TEMPDB 设置为 ON)。

有关临时映射索引的详细信息,请参阅索引 DDL 操作的磁盘空间要求

磁盘空间摘要

下表汇总了磁盘空间计算的结果。

索引操作

以下结构的位置所需的磁盘空间

SORT_IN_TEMPDB = ON 时的脱机索引操作

操作期间的总空间大小:1018 MB

  • 现有表和索引:363 MB*

  • tempdb:202 MB*

  • 新索引:453 MB

操作后所需的总空间大小:453 MB

SORT_IN_TEMPDB = OFF 时的脱机索引操作

操作期间的总空间大小:816 MB

  • 现有表和索引:363 MB*

  • 新索引:453 MB

操作后所需的总空间大小:453 MB

SORT_IN_TEMPDB = ON 时的联机索引操作

操作期间的总空间大小:1058 MB

  • 现有表和索引:363 MB*

  • tempdb(包含映射索引):242 MB*

  • 新索引:453 MB

操作后所需的总空间大小:453 MB

SORT_IN_TEMPDB = OFF 时的联机索引操作

操作期间的总空间大小:856 MB

  • 现有表和索引:363 MB*

  • 临时映射索引:40 MB*

  • 新索引:453 MB

操作后所需的总空间大小:453 MB

*索引操作提交后将释放此空间。

此示例没有考虑任何 tempdb 中所需的附加临时磁盘空间(用于存储并发用户更新和删除操作创建的版本记录)。有关详细信息,请参阅了解基于行版本控制的隔离级别