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

本文详细介绍了SQL Server中数据行结构,包括行结构的总览、变长和定长数据存储,以及行中状态位、固定长度数据、空位图、可变长度数据等组成部分。通过实例分析了变长数据存储的细节,帮助读者理解数据行结构。
摘要由CSDN通过智能技术生成

感觉关于数据库的 数据行结构 (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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值