Microsoft SQL Server DBMS中可空数据类型的大小是多少?
例如,非可空int应该占用4个字节,可用于可空列的空间是多少?
子请求:nullable int,char(N),nvarchar(N) - 我假设它们的存储方式可能不同。
我读过的内容:
答案 0 :(得分:7)
Nullable列和不可为空的列在数据页上占用完全相同的存储。每个数据页面的一部分是空位映射,其中包含表中每个列的位,甚至是不可为空的列。
一种常见的误解是数据页的空位映射部分仅存储可空列的位。这不是真的。 null-bit-map部分包含表中所有列的可空标志。 Here是解释这个神话的好参考。 Here是另一个。
我想知道为什么SQL Server(以及之前的Sybase)使用这种结构。一种可能性是改变柱的可空性可以是“快速”操作。虽然所有页面都有很大的变化,但是通过引入一个新的NULLable字段没有页面拆分的危险。
另一种可能性是它将页面上的布局与表元数据分离。虽然页面不知道列名,但它确实知道基于列索引的所有列。
答案 1 :(得分:4)
根据Microsoft支持
SQL Server 2008中的NULL值:
- SPARSE需要额外增加6个字节的行大小+每个非空列4个字节+值的字节数(类型无关紧要)
- 常规NULL值需要NULL位图中的1位
SQL Server 2008中的空字符串:
- 即使输入空字符串,固定长度数据也需要数据的完整空间 - 可变长度数据需要2个字节的开销来存储数据 - 数值上没有空字符串 - NULL值在NULL位图中需要1位