程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL SERVER 數據頁面頭部結構解析

SQL SERVER 數據頁面頭部結構解析

編輯:關於SqlServer

      解析數據頁面頭部結構:

      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

     

     

    第一行數據

    第二行數據

    剩余空間

    行的偏移

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved