设为首页 收藏本站
查看: 911|回复: 0

[经验分享] 解析SQL SERVER 数据页面头部结构

[复制链接]

尚未签到

发表于 2015-6-30 11:40:42 | 显示全部楼层 |阅读模式
解析数据页面头部结构

if object_id('test') is not null

   drop table test

go

create table test( id int,birth datetime,name char(10))


insert into test

select 1,'2009-11-27','aaaa' union all

select 2,'2009-11-27','aaaa'

exec sp_spaceused 'test'
结构:
  
name
rows
reserved
Data
index_size
unused
test
2         
16 KB
8 KB
8 KB
0 KB

通过dbcc ind (test,test,0)                                                                                        可以查看到该表有两个页,页号分别为109,和89,其中89为数据页。下面通过dbcc page 我们可以查看到该数据页的头部结构,下面我们就来解析头部结构每一个字段的含义。
dbcc traceon(3604)

dbcc page(test,1,89,1)   
  
m_pageId = (1:89)
数据页号
m_headerVersion = 1
头文件版本号,从7.0以后,一直为1
m_type = 1
页面类型,1为数据页
m_typeFlagBits = 0x4
数据页和索引页为4,其他页为0
m_level = 0
该页在索引页(B树)中的级数
m_flagBits = 0x8000
页面标志
m_objId (AllocUnitId.idObj) = 83

m_indexId (AllocUnitId.idInd) = 256

Metadata: AllocUnitId = 72057594043367424
存储单元的ID
Metadata: PartitionId = 72057594038386688
数据页所在的分区号
Metadata: IndexId = 0
页面的索引号
Metadata: ObjectId = 2089058478
该页面所属的对象的id,可以使用object_id获得
m_prevPage = (0:0)
该数据页的前一页面
m_nextPage = (0:0)
该数据页的后一页面
pminlen = 26
定长数据所占的字节数
m_slotCnt = 2
页面中的数据的行数
m_freeCnt = 8034
页面中剩余的空间
m_freeData = 154
从第一个字节到最后一个字节的空间字节数
m_reservedCnt = 0
活动事务释放的字节数
m_lsn = (30:170:20)
日志记录号
m_xactReserved = 0
最新加入到m_reservedCnt领域的字节数
m_xdesId = (0:0)
添加到m_reservedCnt 的最近的事务id
m_ghostRecCnt = 0
幻影数据的行数
m_tornBits = 0
页的校验位或者被由数据库页面保护形式决定分页保护位取代

注意在头文件中几个重要数据:
1、 pminlen = 26:除了表中固定数据所占的字节数外,还需要加上每行开始的4个字节
的行开销。即:
26=4(行开销)+4(int所占空间)+8(datetime 所占空间)+10(char(10)所占的空间)
2、  m_freeData = 154:页面文件的头结构+(存储每行数据需要的额外空间+数据自身的所占的空间)*(行数)
154=96+(7+22)*2=96+58
3、 m_freeCnt = 8034: 每个页面8K,减去m_freeData,再减去用来记录每行数据行偏移的所需要的空间,(每行2个字节)
8034=8192-154-4
4、 m_slotCnt = 2  该页面中数据的行数
注意下m_freeData这个字段的值,它实际的值是从第一个字节到最后一个字节的空间字节数。假如这个表的结构没有改变过,那么数据的存储是
  
头部结构(96B
第一行数据
第二行数据
剩余空间
行的偏移


m_freeData的值是
这三部分数据所占空
间的总和
但是假如修改了表结构,没有进行分页,数据会向后向下移动,那么表的存储情况为变为:
  
头部结构(96B


第一行数据
第二行数据
剩余空间
行的偏移



m_freeData的值是
这五部分数据所占空
间的总和
  



  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81896-1-1.html 上篇帖子: SQL Server 的存储过程[转] 下篇帖子: [转][DBNETLIB][ConectionOpen (connect()).]SQL Server不存在或拒绝访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表