SQL Server可以为空的数据类型大小

时间:2014-01-13 18:20:02

标签: sql sql-server

Microsoft SQL Server DBMS中可空数据类型的大小是多少?

例如,非可空int应该占用4个字节,可用于可空列的空间是多少?

子请求:nullable int,char(N),nvarchar(N) - 我假设它们的存储方式可能不同。

我读过的内容:

  • Where to find the size of SQL Server data types - 获取我的SQL Server版本的sql类型列表及其大小的好方法。但是没有说可空类型。
  • http://msdn.microsoft.com/en-us/library/ms189124.aspx - 有一个计算所需的可变大小列空间的公式:“Variable_Data_Size = 2 +(Num_Variable_Cols x 2)+ Max_Var_Size”。这很奇怪:为什么它包含* 2乘数(没有告诉nvarchar - 这个公式适用于所有可变大小的类型来自解释);它必须是一个错字,Max_Var_Size被添加而不是相乘;最后它包含+2个字节用于存储值的长度,但同样不包含用于存储NULL值的任何内容。据我所知,可以使用值长度为2个字节的3个剩余位来存储NULL标识符,但它是否真的以这种方式存储?
  • How much size "Null" value takes in SQL Server - 至于我,最重要的答案令人困惑。 @Mark Byers说“如果字段是固定宽度,则存储NULL占用与任何其他值相同的空间 - 字段的宽度”,但是不可能在相同的计数中存储标准整数值间隔和附加NULL值位。然后“如果字段是可变宽度,则NULL值不占用空间” - 再次存储NULL根本不能占用空间 - 它必须存储一些空值的标记。与其他答案类似的混淆:有人说它需要2个额外的字节,有人 - 只有1个字节。
  • http://home.clara.net/drdsl/MSSQL/DataTypes.html - 包含类型大小的漂亮表,但同样没有专用于NULL值的任何内容。

2 个答案:

答案 0 :(得分:7)

Nullable列和不可为空的列在数据页上占用完全相同的存储。每个数据页面的一部分是空位映射,其中包含表中每个列的位,甚至是不可为空的列。

一种常见的误解是数据页的空位映射部分仅存储可空列的位。这不是真的。 null-bit-map部分包含表中所有列的可空标志。 Here是解释这个神话的好参考。 Here是另一个。

我想知道为什么SQL Server(以及之前的Sybase)使用这种结构。一种可能性是改变柱的可空性可以是“快速”操作。虽然所有页面都有很大的变化,但是通过引入一个新的NULLable字段没有页面拆分的危险。

另一种可能性是它将页面上的布局与表元数据分离。虽然页面不知道列名,但它确实知道基于列索引的所有列。

答案 1 :(得分:4)

根据Microsoft支持

  1. SQL Server 2008中的NULL值:

    - SPARSE需要额外增加6个字节的行大小+每个非空列4个字节+值的字节数(类型无关紧要)
    - 常规NULL值需要NULL位图中的1位

  2. SQL Server 2008中的空字符串:

    - 即使输入空字符串,固定长度数据也需要数据的完整空间 - 可变长度数据需要2个字节的开销来存储数据 - 数值上没有空字符串 - NULL值在NULL位图中需要1位

  3. 参考:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/0404de89-70dc-4026-9e2e-13ddc3e7c058/null-data-storage-sql-server-2008?forum=sqldatabaseengine