• 解析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(行开销)+4int所占空间)+8(datetime 所占空间)+10char10)所占的空间)

    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的值是

    这五部分数据所占空

    间的总和


     

     

     

  • 相关阅读:
    java开发划分级别的标准
    MySql数据的插入-replace into
    通过DOS命令批量重命名文件
    jira-6.0.1-x64下载地址
    nagiosQL访问时报错PHP message: PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
    shell-保留文件系统下剩余指定数目的文件
    -bash:fork:cannot allocate memory
    HttpWatch手把手图解教程
    HttpWatch Professional Edition 7.2.13下载含( license.lic )
    Resize CentOS Linux hard drive partition (centos 6.3 调整LVS磁盘大小)
  • 原文地址:https://www.cnblogs.com/trieagle/p/1642763.html
Copyright © 2020-2023  润新知