在this one in SO等许多主题中讨论过NULL值大小的主题。
我可以理解,如果行具有固定大小,int
或varchar(x)
NULL valeus占用空间(如果属性为int
则为零,如果属性为varchar(x)
则为空格) NULL位图+ 1个字节。
我创建了一个包含两个属性的表:
CREATE TABLE Person (id int NULL, name VARCHAR(50) NULL)
。
使用script here获取B中每行的大小:
我可以从表中读到这些事实:
- 前三行:每个字母1个字节+ NULL位图1个字节
- 第4行:2个NULL位图。
- 最后两行:4个字节的int + 1个字节用于NULL位图。
为什么上面的int / varchar(50)NULL值没有采用所有声明的大小?
我正在使用SQL Server Management Studio 2014.规范是否已更改?
答案 0 :(得分:3)
datalength()
将无法检索物理长度。 使用sys.dm_db_index_physical_stats
检索min_record_size_in_bytes
,max_record_size_in_bytes
和avg_record_size_in_bytes
。请阅读SQL Server table columns under the hood和Inside the Storage Engine: Anatomy of a record以获取有关记录大小的说明。阅读Row Compression Implementation以更好地了解其他选择。