我对如何在SQL Server中分配tinyint
数据类型大小感到困惑。
我已经创建了表Temp
,并在255
次中迭代了10000
的值。我在保留列中的输出为136 kb
,数据为120 kb
。
[将相同的值255
迭代12000
次后,在保留列中的输出为200 kb
,数据为144 kb
。
drop table TEMP
GO
create table TEMP
(
ids tinyint
)
GO
insert into TEMP
values('255')
go 10000
sp_spaceused 'TEMP'
go
SQL Server在8KB页面上存储行。
您创建的所有行都是相同的,如下所示
10 00 05 00 FF 01 00 00 00
10
状态位A00
状态位B0500
列数偏移量FF
-实际的小整数0100
-列数00
-空位图00
-满足9 byte minimum row size]的填充>注意,tinyint值本身每行仅占用1个字节,并且每行还有8个字节的元数据。
[另外,页面上有96字节页眉的开销,而插槽数组的页脚中每行有2字节的开销。
因此,SQL Server每页最多只能存储(8192-96)/ 11行/ 736(11)行,实际上似乎限制了700行的数量。
10000/700表示需要14.3页才能存储行。在SQL Server 2012中,将从混合扩展区分配前8页,然后在完整扩展区中分配页。
因此您的136 KB可能包括17个8 KB页面,如下所示
一旦填满1.7页,将授予新的统一范围。这是64KB,说明了从136 KB跳到200 KB