欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

SQLSERVER中数据行所占用的最小空间

程序员文章站 2022-05-27 22:04:05
...

数据行所占的最小空间是多少呢? 先来看看下面这张经典数据行结构图(引自Inside Sql Server) 因为可变长度类型的列会有额外的空间开销,所以不考虑可变长度的字段。 现在计算一下除去实际数据后每个数据行所需要占用的空间: 状态位A占一个字节,状态位B占

数据行所占的最小空间是多少呢?

先来看看下面这张经典数据行结构图(引自Inside Sql Server)SQLSERVER中数据行所占用的最小空间



因为可变长度类型的列会有额外的空间开销,所以不考虑可变长度的字段。 现在计算一下除去实际数据后每个数据行所需要占用的空间:

状态位A占一个字节,状态位B占1个字节,用于标识固定字段长度的占2个字节,标识固定列数量的占去2个字节,NULL位图至少占用1个字节。
这样算下来:1+1+2+2+1=7。 也就是在不考虑实际数据的情况下一个数据行最少要占用7个字节。如果实际数据长度为1,那么每一行所占用的空间就为8个字节。真的是这样吗?

现在做个实验验证一下,在下文中如果没有特殊的说明,所有的叙述都是以数据表没有建立聚集索引为前提的。

创建一个表:
Create Table table1
(
col1 char(1)
)

插入2行数据:
insertinto table11 values('a')
insertinto table11 values('b')

然后使用DBCC PAGE命令察看表的结构(为了方便察看,我只保留了Data和Offset Table部分)

DATA:

Slot 0, Offset 0x60, Length 9, DumpStyle BYTE

Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP

Memory Dump @0x44EFC060

00000000: 10000500 610100fe 08†††††††††††††††††....a....

Slot 1, Offset 0x69, Length 9, DumpStyle BYTE

Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP

Memory Dump @0x44EFC069

00000000: 10000500 620100fe 08†††††††††††††††††....b....

OFFSET TABLE:

Row - Offset

1 (0x1) - 105 (0x69)

0 (0x0) - 96 (0x60)