估计堆的大小

可以使用以下步骤来估计在堆中存储数据所需的空间量:

  1. 指定表中将存在的行数:

    Num_Rows = 表中的行数

  2. 指定固定长度和可变长度列的数目,并计算其存储所需的空间:

    计算其中每组列在数据行中占用的空间。 列的大小取决于数据类型和长度规范。

    Num_Cols = 列总数(固定长度和可变长度)

    Fixed_Data_Size = 所有固定长度列的总字节大小

    Num_Variable_Cols = 可变长度列数

    Max_Var_Size = 所有可变长度列的最大总字节大小

  3. 行的一部分,称为 null 位图,用于管理列的可空性。 计算其大小:

    Null_Bitmap = 2 + ((Num_Cols + 7) / 8)

    只应使用此表达式的整数部分。 放弃任何余数。

  4. 计算可变长度的数据大小:

    如果表中存在可变长度的列,请确定用于在行中存储列的空间量:

    Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size

    添加到 Max_Var_Size 的字节用于跟踪每个可变长度列。 此公式假定所有可变长度列都已满 100%。 如果预计将使用较小百分比的可变长度列存储空间,则可以按该百分比调整 Max_Var_Size 值,从而更准确地估计整个表大小。

    注释

    可以合并varcharnvarcharvarbinarysql_variant列,这可能导致定义的表宽度总数超过 8,060 字节。 这些列中的每一列(varcharnvarchar,``varbinarysql_variant 列)的长度仍必须在 8,000 字节以内。 但是,它们的组合宽度可能超过表中的 8,060 字节限制。

    如果没有可变长度的列, 请将Variable_Data_Size 设置为 0。

  5. 计算总行大小:

    Row_Size = 固定数据大小 + 可变数据大小 + Null_Bitmap + 4

    公式中的值 4 是数据行的行标题开销。

  6. 计算每页的行数(每页 8096 个可用字节):

    Rows_Per_Page = 8096 / (Row_Size + 2)

    由于行不跨页,因此每页的行数应向下舍入到最接近的整行。 公式中的数值 2 是页面插槽数组中行的条目。

  7. 计算存储所有行所需的页数:

    页数 = 行数 / 每页行数

    估计的页数应向上舍入到最接近的整页。

  8. 计算在堆中存储数据所需的空间量(每页总字节数 8192):

    堆大小 (字节) = 8192 x Num_Pages

此计算不考虑以下事项:

  • 分区

    分区的空间开销很小,但计算起来较为复杂。 包括这一点并不重要。

  • 分配页

    用于跟踪分配给堆的页面的至少有一个 IAM 页,尽管空间开销很小,但没有算法可以准确计算将使用多少个 IAM 页。

  • 大型对象 (LOB) 值

    用于确定用于存储 LOB 数据类型varchar(max)varbinary(max)nvarchar(max)textntextxmlimage值的空间的算法是复杂的。 只需添加预期的 LOB 值的平均大小并将其添加到总堆大小即可。

  • 压缩

    无法预先计算压缩堆的大小。

  • 稀疏列

    有关稀疏列的空间要求的信息,请参阅 “使用稀疏列”。

另请参阅

无聚集索引的堆表
描述的聚集索引和非聚集索引
创建聚集索引
创建非聚集索引
估计表的大小
估计聚集索引的大小
估计非聚集索引的大小
估计数据库的大小