感觉关于数据库的 数据行结构
(data row/record structure) 这方面的内容国内的资料特别少,老师上课讲到后,怎么搜也搜不到,这里对老师上课讲的和网上看的做一个小总结,加深印象。
文章目录
数据行结构
行结构总览
SQL Server系统 数据类型可以在逻辑上分为两个不同的组,例如固定长度(fixed-length)和可变长度(variable-length)类型。 固定长度数据类型(如int,datetime,char等)始终使用相同的存储空间,无论值是什么,即使它是NULL。 例如,int列始终使用4个字节,nchar(10)列始终使用20个字节来存储信息。
相反,可变长度数据类型(例如varchar,varbinary和其他一些数据类型)使用尽可能多的存储空间来存储数据加上两个额外字节。 例如,nvarchar(4000)列将仅使用12个字节来存储5个字符的字符串,并且在大多数情况下,2个字节用于存储NULL值。 我们将讨论可变长度列以后不为NULL值使用存储空间的情况。
下面是两张关于 SQL Server 里数据行结构的图,其中一张来自http://aboutsqlserver.com/2013/10/15/sql-server-storage-engine-data-pages-and-data-rows/:
该行的前2个字节(称为状态位A(Status Bits A)和状态位B(Status Bits B))是包含有关该行的信息的位图,例如行类型是什么; 该行是否已被逻辑删除(幽灵(ghosted)); 该行是否具有NULL值,可变长度列和版本控制标记。
行中接下来的两个字节用于存储数据的固定长度(fixed-length)部分的长度。 它们之后是固定长度的数据(fixed-length data)。
在固定长度数据部分之后,存在空位图(null bitmap),其包括两个不同的数据元素。 第一个2字节元素是行中的列数(number of columns)。 接下来是空位图数组(null bitmap array),该数组使用一位来表示表中的每一列,无论它是否可为空。
ps. 原文中的 它 有点不明白代指什么。因为使用一位来表示一列,所以共有 Ceiling(#cols / 8)
个字节
即使表没有可空列,空位图也始终存在于堆表或聚簇索引叶行的数据行中。但是,当索引中没有可为空的列时,非页索引行中的空位图不存在,也不存在非聚簇索引的叶级行。
在空位图之后,是该行的可变长度数据(variable-length data)部分。 它从行中的两个字节数量的可变长度列(variable-length columns)开始,后跟可变长度列偏移数组(variable-length column offset array)。 即使值为空,SQL Server 也会为每行中的每个可变长度列存储两个字节的偏移值。它后跟数据的实际可变长度部分。(它 指 可变长度列偏移数组)
最后,在行的末尾有可选的14字节版本控制标记。 该标记在操作期间使用,这需要行版本控制,例如联机索引重建,乐观隔离级别等。
行结构补充
至于 Status Bits A 的 8位 有更具体的定义:
位 | 含义 |
---|---|
Bit 0 | Versioning information. In SQL server 2008 this is always 0 |
Bits 1 to 3 | This is three bit value define the record type. |
0 data record. | |
1 Forwarded record. (转向记录) | |
2 a forwarding stub. (转向存根) | |
3 Index record. | |
4 blob fragment or row overflow data. | |
5 ghost index record. (幽灵索引记录) | |
6 ghost data record (幽灵数据记录) | |
7 ghost version record |