计算sql server sql_variant数据类型用于存储固定长度数据类型的存储空间

时间:2013-08-01 16:12:55

标签: sql-server database-design

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

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

  Key int identitiy(1,1) primary key
  Value sql_variant

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

使用Estimate the Size of a Clustered Index我有:

  Null_bitmap = 3
  Fixed_Data_Size = 4 (Key column int)
  Variable_Data_Size = 2 + 2 + 4 (Value column with an int)
Row_Size = 4 + 8 + 3 + 4 = 19 bytes

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

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

  Null_bitmap = 3
  Fixed_Data_Size = 8 (Key column int, Value column int)
  Variable_Data_Size = 0
Row_Size = 4 + 8 + 3 = 15 bytes

2 个答案:

答案 0 :(得分:1)

你错过了第7部分。

  

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

     

Rows_Per_Page = 8096 /(Row_Size + 2)

     

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

答案 1 :(得分:1)

额外空间是sql_variant元数据信息。来自BOL:

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

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

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