技术开发 频道

SQL Server 2008存储结构之GAM、SGAM

  SGAM页面

PAGE: (1:3)

BUFFER:
BUF @0x0358A7F4
bpage
= 0x062AE000             bhash = 0x00000000              bpageno = (1:3)
bdbid
= 8                      breferences = 3                       bUse1 = 14428
bstat
= 0xc00009               blog = 0x21212159              bnext = 0x00000000
                                                              
PAGE HEADER:                                                  
Page @0x062AE000                                              
m_pageId
= (1:3)               m_headerVersion = 1             m_type = 9
m_typeFlagBits
= 0x0           m_level = 0                     m_flagBits = 0x200
m_objId (AllocUnitId.idObj)
=99 m_indexId (AllocUnitId.idInd)=0 Metadata: AllocUnitId=6488064
Metadata: PartitionId
= 0      Metadata: IndexId = 0           Metadata: ObjectId = 99
m_prevPage
= (0:0)             m_nextPage = (0:0)              pminlen = 90
m_slotCnt
= 2                  m_freeCnt = 6                   m_freeData = 8182
m_reservedCnt
= 0              m_lsn = (18:435:5)              m_xactReserved = 0
m_xdesId
= (0:0)               m_ghostRecCnt = 0               m_tornBits = 177043542
Allocation Status              
GAM (
1:2)=ALLOCATED            SGAM (1:3)=NOT ALLOCATED          PFS(1:1)=0x44 ALLOCATED 100_PCT_FULL
DIFF (
1:6) = CHANGED           ML (1:7) = NOT MIN_LOGGED        

DATA:
Slot
0, Offset 0x60, Length 94, DumpStyle BYTE
Record Type
= PRIMARY_RECORD         Record Attributes =                  
Memory Dump @0x4F32C060
00000000:   00005e00 00000000 00000000 00000000 ?..^.............        
00000010:   00000000 00000000 00000000 00000000 ?................        
00000020:   00000000 00000000 00000000 00000000 ?................        
00000030:   00000000 00000000 00000000 00000000 ?................        
00000040:   00000000 00000000 00000000 00000000 ?................        
00000050:   00000000 00000000 00000000 0000??????..............          

Slot
1, Offset 0xbe, Length 7992, DumpStyle BYTE
Record Type
= PRIMARY_RECORD         Record Attributes =                  
Memory Dump @0x4F32C0BE
00000000:   0000381f 20ee2000 00000000 00000000 ?..8. . .........        
00000010:   00000000 00000000 00000000 00000000 ?................
00001F30:  
00000000 00000000 ???????????????????........          

 
   以下为DBCC PAGE(TESTDB,1,3,3)得到的相关信息,有兴趣的可以和20ee20做一下对比。

(1:0)        - (1:32)       = NOT ALLOCATED                              
(
1:40)       -              =     ALLOCATED                              
(
1:48)       - (1:64)       = NOT ALLOCATED                              
(
1:72)       - (1:88)       =     ALLOCATED                              
(
1:96)       -              = NOT ALLOCATED                              
(
1:104)      - (1:120)      =     ALLOCATED                              
(
1:128)      - (1:160)      = NOT ALLOCATED                              
(
1:168)      -              =     ALLOCATED                              
(
1:176)      - (1:272)      = NOT ALLOCATED

 
  最后让我们用Internals Viewer插件看一下SGAM页的全貌吧。

1
 

  总结一下,关于GAM和SGAM页比较困难的地方:

  1、 关于GAM和SGAM页中的BUFFER信息基本无法理解,也找不到相关材料。

  2、 PAGE HEADER的部分信息和Slot 0中的一部分信息,也无法找到相关材料。

  3、 SGAM页中的NOT ALLOCATED实际上是统一类型区或者已使用完的混合类型的区,而ALLOCATED实际上为含有自由页面的混合区。

  4、 GAM页中0代表已分配,1代表自由区;和一般的标志位的含义刚好相反。

  5、 GAM和SGAM实际上只分配了280个页面,即35个区;显示出来的数据内容虽然很多,但后面的分区信息实际上是不存在的。

  6、 GAM和SGAM通过DBCC的printopt为3的属性显示出来的页面分配信息看似是断号的。

  7、 GAM和SGAM的区信息的字节是通过二级制反转得到的。

  GAM和SGAM页的总的大小为8192个字节;文件头为96个字节,slot 0为94个字节,slot 1的头部的系统信息为4个字节,尾部的系统信息为10个字节,所以有效存储应为7988个字节,63904个区,511230个页;事实上当数据文件超过约4G的时候,我们将能在第511232页、 第511233页分别找到其对应的GAM、SGAM页面。

0
相关文章