【问题标题】:Calculate storage space used by sql server sql_variant data type to store fixed length data types计算sql server sql_variant数据类型存储固定长度数据类型所使用的存储空间
【发布时间】:2013-08-02 16:24:24
【问题描述】:

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

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

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

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

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

空位图 = 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) Variable_Data_Size = 0
Row_Size = 4 + 8 + 3 = 15 字节

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

    你错过了第 7 部分。

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

    Rows_Per_Page = 8096 / (Row_Size + 2)

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

    【讨论】:

    • 您好罗伯特,我担心行数据使用的空间。这一点与页面使用的空间有关,特别是每个数据页面底部的插槽数组 (sqlskills.com/blogs/paul/…)。我编辑了帖子,还添加了我用固定长度列而不是 sql_variant 进行的测试,并且计算有效,所以我显然遗漏了一些东西,但我不知道是什么。
    猜你喜欢
    • 2023-03-30
    • 2014-06-11
    • 2012-10-06
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多