估计堆的大小

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系统(PDW)Microsoft Fabric中的SQL数据库

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

  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 中的字节用于跟踪每个可变长度列。 此公式假设所有可变长度列均百分之百充满。 如果预计可变长度列占用的存储空间比例较低,则可以按照该比例调整 Max_Var_Size 值,从而对整个表大小得出一个更准确的估计。

    Note

    你可以组合 varcharnvarcharvarbinarysql_variant 列,使定义的表的总宽度超过 8,060 字节。 对于 varchar、nvarchar、varbinary 或 sql_variant 列,每列的长度仍不得超过 8,000 字节。 但是,它们的组合宽度可能超过表中的 8,060 字节限制。

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

  5. 计算总的行大小:

    • Row_Size = Variable_Data_Size + Null_Bitmap + 4

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

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

    • Rows_Per_Page = 8096 / (Row_Size + 2)

    由于行不跨页,因此每页的行数应向下取整,以达到最接近的完整行。 公式中的数值 2 是计算行数时引入的行大小余量。

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

    • Num_Pages = Rows_Per_Page /

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

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

    堆大小(字节)= 8192 x Num_Pages

此计算不考虑以下条件:

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

  • 分配页:至少有一个 IAM 页用于跟踪分配给堆的页面,但所占空间非常小,并且没有算法能够精确地确定将会使用多少个 IAM 页。

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

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

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