标题 | SQL SERVER 数据页面头部结构解析 |
内容 | 解析数据页面头部结构: 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) 第一行数据 第二行数据 剩余空间 行的偏移 |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。