我正在尝试计算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
答案 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对象中包含的元数据的长度。*