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

Sas*_*sha 11 sql sql-server

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

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

子问题:nullable int,char(N),nvarchar(N) - 我假设它们可能以不同方式存储.

我读过的内容:

  • 在哪里可以找到SQL Server数据类型的大小 - 获取SQL版本列表的好方法以及我的SQL Server版本的大小.但是没有说可空类型.
  • 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标识符,但它是否真的以这种方式存储?
  • SQL Server中"Null"值的大小 - 对我而言,最顶层的答案令人困惑.@Mark Byers说"如果字段是固定宽度,则存储NULL占用与任何其他值相同的空间 - 字段的宽度",但是不可能在相同的计数中存储标准整数值间隔和附加NULL值位.然后"如果字段是可变宽度,则NULL值不占用空间" - 再次存储NULL根本不能占用空间 - 它必须存储一些空值的标记.与其他答案类似的混淆:有人说它需要2个额外的字节,有人 - 只有1个字节.
  • http://home.clara.net/drdsl/MSSQL/DataTypes.html - 包含类型大小的漂亮表,但同样没有专门用于NULL值的表.

Gor*_*off 8

可空列和不可空列在数据页上占据完全相同的存储空间.每个数据页的一部分是空位映射,它对表中的每一列都有一个位,甚至是非可空的.

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

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

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