剖析SQLSERVER的页面结构行类型篇一由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“组织结构类型案例分析”。
剖析SQLSERVER2005的页面结构
行类型篇1
行(和我平常说的表的记录行有点差别哦,注意理解)简单的可理解为数据库物理存储的表、索引及其它类型的数据的基本单元。当然行结构远不止如下说明的那么简单,更深入的有待再度剖析,比如打开行版本后slot记录就会多出14个字节的xsn。
行记录是表里的数据,记录着表的内容。反之也就是表的记录是以数据行的形式保存在数据库的页面上。它一般是堆表的行或索引的叶级行,显然的是它一定保存着行的所有列数据,在这儿我们得注意一下,这个所有的列包含两层意思,一就是列的数据,另外可能是行溢出数据的指针。指针的情况又分为两种可能:一是使用了LOB数据类型,另一个是非LOB类型存储在超行最大8060限制时。这些不在此篇讨论的范围,一带而过。
关于如何查看页面内容的方法我在 SQL2005中的事务与锁定
(九)一文有详细的说明,下面为了便于说明先写一个测试用例:
上例只是出现了行类型的一部分(PRIMARY_RECORD、FORWARDING_STUB、FORWARDED_RECORD),下面我们来说说行的类型有哪几类:
1、PRIMARY_RECORD 主记录
当Record Type = PRIMARY_RECORD时表明当前记录是主记录,我们随便找一个主记录行前四个字节:1000c907,状态位A为:0x10 ,bit1-3位全是0,当全是0时代表当前行是主记录。行的基本结构我在SQL2005中的事务与锁定
(九)一文有详细介绍,在这儿不再细说。
2、FORWARDING_STUB 转移根当
Record Type = FORWARDING_STUB时表明当前记录是行转移后留下的一条转移根信息。在这儿我们应该清楚一点这只会发生在堆表,因为在当前位置已经无法保存数据,所以搬移当前位置,只是在当前位置留一个类指针的数据,指向最终搬向的数据。从技术上来说,它也避免SQLSERVER误把数据存在原来的位置,但是也增加了select的IO量,虽然我们可用使用聚集索引来回避,但是这种性能上的得失全是在于DBA自己权衡。请看如下页面信息片断:我们发现这一行只有9个字节的长度,细一看和我在介 在上表中状态位0
4和以前介绍行的基本信息时的状态位A意义相同,bit1-3为1代表当前记录行是转移根,那这后面的文件号+页面ID+slot号,它最终指向数据搬到的地点,如何和实现关联起来呢?下面请看我的转换SQL语句(我已经封装成存储过程sp_us_FPSinfo方便大家调用):
这个转换的结果表明本来在当前位置的记录已经转移到文件号为1页面为221的slot为2的记录,在上面一开始我们查看221页面的信息,的确可以对应上,在这儿我们介绍一下上面的这一条记录转换的原因,因为我们一开始定义的表结构并插入记录在页面220的第一条记录是’aaaaa’,后因为修改列长,造成页面记录转换,根据上面的转换我们在页面221的第二条记录的确看到’aaaaa’的影子。
3、FORWARDED_RECORD 转移记录
当Record Type = FORWARDED_RECORD时表明当前是一条转换过来的记录。这正好和第二种类型相对,就是转移根指向的记录行,这个类型的记录行与基本行的结构还是有点差别的,前一部分差不多,只是最后有点不同。
状态A的bit1-3 为 1 表明当前记录行为转移根所指向的转移记录。它和主数据记录
有差别就是在最后多了14个字节的数据,最后的8位通过我以上的过程(sp_us_FPSinfo),很明显的得到了转移根所有的文件页面及slot号。
4、INDEX_RECORD 索引记录
我们先来生成一条索引记录,在对上表创建一个索引,脚本如下:
索引行有别于基本行的格式大体如下:
(未完,待续)