在SQL Server中,为什么将tinyint与9B存储在行中。由于某种原因,在NULL位图掩码的末尾似乎还有一个字节。
使用tempdb; 走 创建表tbl ( 我TINYINT不为空 ); 走 插入tbl(i) 值(1); 走 DBCC IND('tempdb','tbl',-1); 走 DBCC TRACEON(3604); -页面转储将进入控制台 走 DBCC PAGE('tempdb',1,168,3); 走
结果(由于DBCC PAGE首先显示了最低有效字节,所以我反转了字节):
Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)
1
这只是教育吗?我全都在需要时修剪空间,但这可能不是我要担心的1个字节……
—
Aaron Bertrand
这是教育性的。我的下一个SQLSaturday演讲是关于compressin;因此,我为每种数据类型创建了示例,以帮助人们理解其数据类型选择的含义并显示压缩对所有数据类型的影响。
—
ooutwire 2012年
我假设tinyint将以1B(它)的形式存储,而开销为7B。我想知道记录末尾的额外字节是多少???
—
ooutwire 2012年
当TINYINT列不是表中的唯一列时,我会看到不同的结果(尽管不确定它们是否与您的期望更加一致)。似乎是一个非常罕见的用例。
—
亚伦·伯特兰
当然不是用例的共同关注点。我只是试图仅显示每种数据类型,以便既了解存储所涉及的间接费用,又让初学者了解页面上列的外观。我觉得有多余的字节很奇怪...让我疯狂地看到它而没有理由。
—
ooutwire 2012年