SQL Server中的小整数空间分配

问题描述 投票:0回答:1

我对如何在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 sql-server sql-server-2012 sqldatatypes
1个回答
2
投票

SQL Server在8KB页面上存储行。

您创建的所有行都是相同的,如下所示

10 00 05 00 FF 01 00 00 00 
  • [10状态位A
  • 00状态位B
  • [0500列数偏移量
  • 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页面,如下所示

  • 8页混合范围内
  • 1 IAM页面
  • 均匀范围内的8页(免费1.7页)
  • 一旦填满1.7页,将授予新的统一范围。这是64KB,说明了从136 KB跳到200 KB

© www.soinside.com 2019 - 2024. All rights reserved.