SQLSERVER中数据行所占用的最小空间
数据行所占的最小空间是多少呢? 先来看看下面这张经典数据行结构图(引自Inside Sql Server) 因为可变长度类型的列会有额外的空间开销,所以不考虑可变长度的字段。 现在计算一下除去实际数据后每个数据行所需要占用的空间: 状态位A占一个字节,状态位B占
数据行所占的最小空间是多少呢?
先来看看下面这张经典数据行结构图(引自Inside Sql Server)
因为可变长度类型的列会有额外的空间开销,所以不考虑可变长度的字段。 现在计算一下除去实际数据后每个数据行所需要占用的空间:
状态位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)
上一篇: PHP调用谷歌翻译_PHP教程
下一篇: Oracle CONNECT BY的用法