0

我正在尝试计算sql_variant用于存储固定长度数据类型的存储空间。

对于我的测试,我创建了一个包含两列的表:

  Key int identitiy(1,1) 主键
  值 sql_variant

我添加了一行int类型的值为 1 的行,我使用 DBCC PAGE 检查了行的大小,结果是 21 个字节。

使用估计聚集索引的大小我有:

  空位图 = 3
  Fixed_Data_Size = 4(键列 int)
  Variable_Data_Size = 2 + 2 + 4(带 in​​t 的值列)
Row_Size = 4 + 8 + 3 + 4 = 19 字节

为什么行占用 21 个字节?我的计算中缺少什么?

我使用 int 列而不是 sql_variant 对表进行了相同的分析,DBCC PAGE 报告的使用字节数为 15,这与我的计算相符:

  空位图 = 3
  Fixed_Data_Size = 8(键列 int,值列 int)
  变量数据大小 = 0
Row_Size = 4 + 8 + 3 = 15 字节
4

2 回答 2

1

你错过了第 7 部分。

7. 计算每页的行数(每页 8096 个空闲字节):

Rows_Per_Page = 8096 / (Row_Size + 2)

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

于 2013-08-01T17:09:42.353 回答
1

多余的空间是 sql_variant 元数据信息。来自 BOL:

http://msdn.microsoft.com/en-us/library/ms173829.aspx

* sql_variant 列的每个实例都记录了数据值和元数据信息。这包括基本数据类型、最大大小、比例、精度和排序规则。

为了与其他数据类型兼容,报告 sql_variant 对象长度的目录对象(例如 DATALENGTH 函数)报告数据长度。不返回包含在 sql_variant 对象中的元数据的长度。*

于 2013-08-02T15:32:37.440 回答