可以使用以下步骤来估计在堆中存储数据所需的空间量:
指定表中将存在的行数:
Num_Rows = 表中的行数
指定固定长度和可变长度列的数目,并计算其存储所需的空间:
计算其中每组列在数据行中占用的空间。 列的大小取决于数据类型和长度规范。
Num_Cols = 列总数(固定长度和可变长度)
Fixed_Data_Size = 所有固定长度列的总字节大小
Num_Variable_Cols = 可变长度列数
Max_Var_Size = 所有可变长度列的最大总字节大小
行的一部分,称为 null 位图,用于管理列的可空性。 计算其大小:
Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
只应使用此表达式的整数部分。 放弃任何余数。
计算可变长度的数据大小:
如果表中存在可变长度的列,请确定用于在行中存储列的空间量:
Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
添加到 Max_Var_Size 的字节用于跟踪每个可变长度列。 此公式假定所有可变长度列都已满 100%。 如果预计将使用较小百分比的可变长度列存储空间,则可以按该百分比调整 Max_Var_Size 值,从而更准确地估计整个表大小。
注释
可以合并
varchar、nvarchar、varbinary或sql_variant列,这可能导致定义的表宽度总数超过 8,060 字节。 这些列中的每一列(varchar、nvarchar,``varbinary或sql_variant列)的长度仍必须在 8,000 字节以内。 但是,它们的组合宽度可能超过表中的 8,060 字节限制。如果没有可变长度的列, 请将Variable_Data_Size 设置为 0。
计算总行大小:
Row_Size = 固定数据大小 + 可变数据大小 + Null_Bitmap + 4
公式中的值 4 是数据行的行标题开销。
计算每页的行数(每页 8096 个可用字节):
Rows_Per_Page = 8096 / (Row_Size + 2)
由于行不跨页,因此每页的行数应向下舍入到最接近的整行。 公式中的数值 2 是页面插槽数组中行的条目。
计算存储所有行所需的页数:
页数 = 行数 / 每页行数
估计的页数应向上舍入到最接近的整页。
计算在堆中存储数据所需的空间量(每页总字节数 8192):
堆大小 (字节) = 8192 x Num_Pages
此计算不考虑以下事项:
分区
分区的空间开销很小,但计算起来较为复杂。 包括这一点并不重要。
分配页
用于跟踪分配给堆的页面的至少有一个 IAM 页,尽管空间开销很小,但没有算法可以准确计算将使用多少个 IAM 页。
大型对象 (LOB) 值
用于确定用于存储 LOB 数据类型
varchar(max)、varbinary(max)、nvarchar(max)、textntextxml 和image值的空间的算法是复杂的。 只需添加预期的 LOB 值的平均大小并将其添加到总堆大小即可。压缩
无法预先计算压缩堆的大小。
稀疏列
有关稀疏列的空间要求的信息,请参阅 “使用稀疏列”。
另请参阅
无聚集索引的堆表
描述的聚集索引和非聚集索引
创建聚集索引
创建非聚集索引
估计表的大小
估计聚集索引的大小
估计非聚集索引的大小
估计数据库的大小