数据库之数据行结构(SQL Server )

感觉关于数据库的 数据行结构 (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/:
数据库之数据行结构(SQL Server )_第1张图片

该行的前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字节版本控制标记。 该标记在操作期间使用,这需要行版本控制,例如联机索引重建,乐观隔离级别等。

行结构补充

数据库之数据行结构(SQL Server )_第2张图片

至于 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

你可能感兴趣的:(#,数据库,数据行结构,data,row,structure,data,record,structure)