結構:
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這個字段的值,它實際的值是從第一個字節到最后一個字節的空間字節數。假如這個表的結構沒有改變過,那么數據的存儲是
|