剖析SQLSERVER2005的页面结构--行类型篇一

-狙击手- 2009-12-09 03:35:12
加精
剖析SQLSERVER2005的页面结构


行类型篇一


全文阅读剖析SQLSERVER2005的页面结构



行(和我平常说的表的记录行有点差别哦,注意理解)简单的可理解为数据库物理存储的表、索引及其它类型的数据的基本单元。当然行结构远不止如下说明的那么简单,更深入的有待再度剖析,比如打开行版本后slot记录就会多出14个字节的xsn。
行记录是表里的数据,记录着表的内容。反之也就是表的记录是以数据行的形式保存在数据库的页面上。它一般是堆表的行或索引的叶级行,显然的是它一定保存着行的所有列数据,在这儿我们得注意一下,这个所有的列包含两层意思 ,一就是列的数据,另外可能是行溢出数据的指针。指针的情况又分为两种可能:一是使用了LOB数据类型,另一个是非LOB类型存储在超行最大8060限制时。这些不在此篇讨论的范围,一带而过。
关于如何查看页面内容的方法我在 SQL2005中的事务与锁定(九)一文有详细的说明,下面为了便于说明先写一个测试用例:

create table testtb(id int identity(1,1),col char(985))
go
insert into testtb
select REPLICATE('a',5) union all
select REPLICATE('b',5) union all
select REPLICATE('c',5) union all
select REPLICATE('d',5) union all
select REPLICATE('e',5) union all
select REPLICATE('f',5) union all
select REPLICATE('g',5) union all
select REPLICATE('h',5) union all
select REPLICATE('i',985) union all
select REPLICATE('j',985)

go


alter table testtb
alter column col char(1000) --
go
dbcc ind(testcsdn,testtb,-1)--220 221 232
dbcc traceon(3604)
dbcc page(testcsdn,1,220,1)
/*
DATA:
Slot 0, Offset 0x60, Length 9, DumpStyle BYTE
Record Type = FORWARDING_STUB Record Attributes =
Memory Dump @0x4431C060
0000000: 04dd0000 00010002 00†††††††††††††††††.........

Slot 1, Offset 0x69, Length 1996, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x4431C069
......

Slot 2, Offset 0x835, Length 9, DumpStyle BYTE
Record Type = FORWARDING_STUB Record Attributes =
Memory Dump @0x4431C835
......
000007C0: 20202020 20202020 200300f8 †††††††††† ...

DBCC 执行完毕。如果DBCC 输出了错误信息,请与系统管理员联系。
*/
dbcc page(testcsdn,1,221,1)
/*
PAGE: (1:221)
DATA:
Slot 0, Offset 0x1014, Length 1996, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x3432D014
00000000: 1000c907 09000000 69696969 69696969 †.......iiiiiiii
......
......
Slot 2, Offset 0x60, Length 2010, DumpStyle BYTE
Record Type = FORWARDED_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Memory Dump @0x3432C060
00000000: 3200c907 01000000 61616161 61202020 †.......aaaaa
*/


上例只是出现了行类型的一部分(PRIMARY_RECORD、FORWARDING_STUB 、FORWARDED_RECORD),下面我们来说说行的类型有哪几类:

1、PRIMARY_RECORD 主记录
当Record Type = PRIMARY_RECORD时表明当前记录是主记录,我们随便找一个主记录行前四个字节:1000c907 ,状态位A为:0x10 ,bit1-3位全是0 ,当全是0时代表当前行是主记录。行的基本结构我在SQL2005中的事务与锁定(九)一文有详细介绍,在这儿不再细说。

Record Type 行前四个字节 状态位A bit1-3
PRIMARY_RECORD 1000c907 0x10 0

2、FORWARDING_STUB 转移根
当Record Type = FORWARDING_STUB时表明当前记录是行转移后留下的一条转移根信息。在这儿我们应该清楚一点这只会发生在堆表,因为在当前位置已经无法保存数据,所以搬移当前位置,只是在当前位置留一个类指针的数据,指向最终搬向的数据。从技术上来说,它也避免SQLSERVER误把数据存在原来的位置,但是也增加了select的IO量,虽然我们可用使用聚集索引来回避,但是这种性能上的得失全是在于DBA自己权衡。请看如下页面信息片断:

Slot 0, Offset 0x60, Length 9, DumpStyle BYTE
Record Type = FORWARDING_STUB Record Attributes =
Memory Dump @0x4431C060
0000000: 04dd0000 00010002 00†††††††††††††††††.........
我们发现这一行只有9个字节的长度,细一看和我在SQL2005中的事务与锁定(九)介绍的基本行结构有了差别,那这9个字节代表什么意思呢,这9个字节代表意思如下表:

状态位 文件号+页面ID SLOT号
04 dd0000000100 02 00

在上表中状态位04和以前介绍行的基本信息时的状态位A意义相同,bit1-3为1代表当前记录行是转移根,那这后面的文件号+页面ID+slot号,它最终指向数据搬到的地点,如何和实现关联起来呢?下面请看我的转换SQL语句(我已经封装成存储过程sp_us_FPSinfo方便大家调用):


---------------------------------------------------------------------
-- Author : HappyFlyStone
-- Date : 2009-11-30
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 (Build 3790: SP2)
-- 转载注明出处及相关信息
---------------------------------------------------------------------
CREATE PROC sp_us_FPSinfo
@FORWARDING_STUB BINARY(8)
AS
SELECT
CAST(
CONVERT(INT,SUBSTRING(@FORWARDING_STUB,6,1)) * POWER(2,8)
+ CONVERT(INT,SUBSTRING(@FORWARDING_STUB,5,1))
AS VARCHAR)+' : ' --File_num
+CAST(
(CONVERT(INT,SUBSTRING(@FORWARDING_STUB,4,1)) * POWER(2,24))
+ (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,3,1)) * POWER(2,16))
+ (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,2,1)) * POWER(2,8 ))
+ (CONVERT(INT,SUBSTRING(@FORWARDING_STUB,1,1))) AS VARCHAR)
+' : ' --Page_id
+CAST(CAST(SUBSTRING(@FORWARDING_STUB,8,1) * POWER(2,8 ) +
+ SUBSTRING(@FORWARDING_STUB,7,1) AS INT ) AS VARCHAR)
AS 'FILE_NUM:PAGE_ID:SLOT_ID'
GO

EXEC sp_us_FPSinfo 0xDD00000001000200 --

DROP PROC sp_us_FPSinfo
/*
FILE_NUM:PAGE_ID:SLOT
--------------------------
1 : 221 : 2

(1 行受影响)
*/

....

4、INDEX_RECORD 索引记录
我们先来生成一条索引记录,在对上表创建一个索引,脚本如下:

drop table testtb
go
create table testtb(id int ,pid int,col char(10))
go
insert into testtb select 9,5,'a'
insert into testtb select 3,4,'b'
insert into testtb select 4,3,'c'
insert into testtb select 5,2,'d'
insert into testtb select 6,1,'e'
go--clustered
create index idx_testtb_id on testtb(pid,id)
go

dbcc traceon(3604)
dbcc ind(testcsdn,testtb,-1)--> 230
dbcc page(testcsdn,1,232,1)
go
/*
Slot 0, Offset 0x60, Length 20, DumpStyle BYTE

Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x446AC060

00000000: 16010000 00060000 00dc0000 00010004 †................
00000010: 000300f8 ††††††††††††††††††††††††††††....
*/

索引行有别于基本行的格式大体如下:
状态位     数据     文件号+页面号+槽号 列数(包括地址) NULL位图
16    010000 00060000 00 dc0000 00010004 00 0300     f8
Bit4为1代表有 Data     EXEC sp_us_FPSinfo 数据两列加上位置,共三列
NULL位图          0xdc00000001000400                        Bit3-1为3代表
是一条索引记录           FILE_NUM:PAGE_ID:SLOT_ID
                  --------------------------
 1 : 220 : 0


(未完,待续)

谢谢大家关注我的blog!!






...全文
1356 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanhanchang 2010-03-15
  • 打赏
  • 举报
回复
看看了 学习学习
Liao_huakai 2009-12-14
  • 打赏
  • 举报
回复
学习ing!!!!!
tjb1216 2009-12-13
  • 打赏
  • 举报
回复
懒得看
a3767003 2009-12-13
  • 打赏
  • 举报
回复
878979
xie_hai 2009-12-13
  • 打赏
  • 举报
回复
学习ing
fcuandy 2009-12-12
  • 打赏
  • 举报
回复
sf
com_gao 2009-12-12
  • 打赏
  • 举报
回复
看不懂了
mlsml 2009-12-12
  • 打赏
  • 举报
回复
学习了~~
netcup 2009-12-12
  • 打赏
  • 举报
回复
底层的东西啊,牛人
  • 打赏
  • 举报
回复
先看看嘿嘿
liu_ljj 2009-12-12
  • 打赏
  • 举报
回复
顶下,建议去看下 sqlserver 技术内幕:存储引擎 ,这样比较系统
yzgywxb 2009-12-12
  • 打赏
  • 举报
回复
已阅 学习中
lchstudy 2009-12-11
  • 打赏
  • 举报
回复
路过,有时间好好分析一下
Kurt_Yang_SH 2009-12-11
  • 打赏
  • 举报
回复
那本 赵松涛的 <<sql server 2005 奥秘>> 中也有类似的研究,不过没这么细.
十一文 2009-12-11
  • 打赏
  • 举报
回复
专业学习
SlaughtChen 2009-12-11
  • 打赏
  • 举报
回复
学习,学习,再学习
幸运的意外 2009-12-11
  • 打赏
  • 举报
回复
学习学习.
SQL77 2009-12-11
  • 打赏
  • 举报
回复
学习先,哎,
没时间看现在,
Mr_Nice 2009-12-11
  • 打赏
  • 举报
回复
刚看到,继续学习!
跃动的华尔兹 2009-12-11
  • 打赏
  • 举报
回复
受教了……
加载更多回复(57)
SQL Server 2005微软官方权威参考书.   公球公认SQL Server 2005 经典著作..   数据库“铁人”、微软MVP胡百敬先生鼎力推荐   微软SQL Server 总部Principal Group 项目经理朱凌志鼎力推荐   本书详细介绍了数据引擎的基础运作,包含了数据库的设定与数据实际在硬盘的摆放、索引结构、事务与锁定等。除了解释设计理念与运作原理外,还辅之以测试验证的方式。数据库开发者和管理员可从中获得最优的方法、务实的建议和实例代码来帮助他们掌握创建和维护企业级关系数据库所需的复杂技术。该书获得资深专家关于创建和维护健壮数据库的高屋建瓴般的视野和入木三分的剖析,十分适合有一定数据库基础的读者学习。 内容简介 本书是Inside Microsoft SQL Server 2000的作者Kalen Delaney的又一经典著作,是Inside Microsoft SQL Server 2005系列四本著作中的一本。本书对SQL Server 2005存储引擎方面的知识进了全面而详细的阐述,包括数据库文件、日志和恢复、表、索引及其管理、锁定和并发等内容。除了解释设计理念与运作原理外,书中还辅之以大量简短而有力的实例。您将跟随一位广受欢迎的作家同时也是SQL Server资深专家一起深入探索SQL Server存储引擎的技术内幕。   本书适合于专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者。本书不仅适合SQL Server 2005的初级读者,也适合SQL Server 2005的中高级读者。读者可以从中获得最优的方法、务实的建议和实例代码来帮助他们掌握创建和维护企业级关系数据库所需的复杂技术。本书是所有SQL Server 2005用户的案头必备之书。 作者简介 Kalen Delaney,她还是微软出版社inside SQL Sever丛书的编辑。她从1987年开始便一直从事SQL Server相关的工作,1995年被评为MVP(微软最有价值专家》。她同时也是Solid Quality Learning的首席顾问和创始人。除此之外,她还是SQL Server Magazine的优秀编辑和专栏作家,她还写作了大量的SQL Server类书籍,包括著名的Inside Microsoft SQL Server2000。 目录 前言 致谢 引言 第1章 SQL Server 2005 的安装与升级  1.1 SQL Server 2005安装前提   SQL Server 2005 版本   软件要求   硬件要求  1.2 安装前决策   安全性和用户上下文   字符与排序规则   排序次序   安装SQL Server的多个实例   安装SQL Server命名实例  1.3 做好安装准备   SQL Server 2005升级向导  1.4 迁移还是升级   迁移   升级   升级后的操作  1.5 选择组件   SQL Server数据库服务(数据库引擎)   Analysis Services   Reporting Services   Notification Services   Integration Services   工作站组件、联机丛书及开发工具  1.6 小结 第2章 SQL Server 2005体系结构  2.1 SQL Server引擎组件   观测数据库引擎为   协议   表格格式数据流(TDS)端点   关系引擎   存储引擎   SQLOS  2.2 内存   缓冲池和高速数据缓冲区   访问内存中的数据页   管理数据高速缓冲区中的页面   检查点   管理其他高速缓存中的内存   调节内存大小   调节缓存池大小  2.3 小结 第3章 SQL Server 2005的配置  3.1 使用SQL Server 配置管理器   配置网络协议   默认的网络配置   管理服务  3.2 系统配置   任务管理   资源分配   系统分页文件的位置   非必需的服务   网络协议   与SQL Server 早期版本之间的兼容性   跟踪标记(Trace Flags)   SQL Server 的配置设定   内存选项   调度选项(Scheduling Options)   磁盘I/O 选项   查询处理选项   默认跟踪(Default Trace)  3.3 小结 第4章 数据库和数据库文件 第5章 日志和恢复 第6章 表 第7章 索引的内部构造和管理 第8章 锁定和并发

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧