【问题标题】:Tiny Integer Space allocation in SQL ServerSQL Server 中的微小整数空间分配
【发布时间】:2020-08-11 09:01:45
【问题描述】:

我对如何在 SQL Server 中分配 tinyint 数据类型大小感到有些困惑。

我创建了表 Temp 并将值 255 迭代了 10000 次。我在保留列中的输出为136 kb,数据为120 kb

当我在12000 上迭代相同的值255 时,我在保留列中得到输出为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】:

    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),实际上在插入第 700 行并且页面容量 > 95% 之后,PFS 页面会报告数据页是100_PCT_FULL,所以这是使用单例插入实现的每页最大行数。

    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 的跳跃

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多