SQL Server 2008存儲構造之GAM、SGAM引見。本站提示廣大學習愛好者:(SQL Server 2008存儲構造之GAM、SGAM引見)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 2008存儲構造之GAM、SGAM引見正文
假如SQL Server須要找到一個新的完整沒有應用的區,那末它可使用任何一個在GAM頁面中對應的比特位值為1的區。假如SQL Server須要找到一個有著可用空間(有一個或多個自在頁面)的混雜類型的區,那末它可以尋覓一個對應的GAM中的值為0、SGAM中的值為1的區。假如不存在有可用空間的混雜類型的區,SQL Server會應用GAM頁面來尋覓一個全新的區並將其分派為混雜類型的區,然後應用該區中的一頁。假如基本沒有自在區,那末這個文件曾經滿了。
第0頁 第1頁 第2頁 第3頁 第4頁 第5頁 第6頁 第7頁 m_type=15 m_type=11 m_type=8 m_type=9 m_type=0 m_type=0 m_type=16 m_type=17 頭文件頁 PFS頁 GAM頁 SGAM頁 保存頁 保存頁 DCM頁 BCM頁SQL Server可以或許敏捷地鎖定一個文件中的GAM頁面,由於它老是位於任何數據庫文件的第三頁上(頁碼為2)。SGAM頁面是在第四頁上(頁碼為3)。下一個GAM頁面湧現在第一個GAM頁面(頁碼為2)今後的每511 230個頁面中,而且下一個SGAM頁面湧現在第一個SGAM頁面(頁碼為3)今後的每511 230個頁面中。每個數據庫文件的頁碼為0的頁面是文件頭頁面,而且每一個文件唯一一頁。頁碼0是頭文件頁,頁碼1是頁面自在空間頁(Page Free Space,PFS)。
在SQLServer2008的每個數據庫中的前八頁次序都是固定的。
除第9頁為數據庫的BOOT頁之外,從第8頁到第173頁為SQLServer2008外部體系表的相干存儲信息,然後從第174頁到第279頁為未分派頁面。由於第一頁從0開端,所以恰好280頁,即和我們看到的數據庫數據文件的年夜小完整相等。
第8頁 第8頁 第8頁 第N頁 第173頁 第279頁 m_type=1 m_type=13 m_type in (1,2,10) N/A Data頁 Boot頁 重要為外部體系表相干信息 未分派以下截圖是經由過程SQLServer2008的Internals Viewer插件看到的全體頁面構造,該插件是從http://www.SQLInernalsViewer.com網站下載的,分為分歧的.net版本。
備注:TESTDB為新創立的空數據庫,沒有任何用戶自界說對象,直到有建表劇本為止;
關於數據庫頁類型以下所示:
類型
頁面類型稱號
頁面類型描寫
1
Data page
堆表和集合索引的葉子節點數據
2
Index page
集合索引的非葉子節點和非集合索引的一切索引記載
3
Text mixed page
A text page that holds small chunks of LOB values plus internal parts of text tree. These can be shared between LOB values in the same partition of an index or heap.
4
Text tree page
A text page that holds large chunks of LOB values from a single column value.
7
Sort page
排序時所用到的暫時頁,排序中央操作存儲數據用的。
8
GAM page
全局分派映照(Global Allocation Map,GAM)頁面 這些頁面記載了哪些區曾經被分派並用作何種用處。
9
SGAM page
同享全局分派映照(Shared Global Allocation Map,GAM)頁面 這些頁面記載了哪些區以後被用作混雜類型的區,而且這些區需含有至多一個未應用的頁面。
10
IAM page.
有關每一個分派單位中表或索引所應用的區的信息
11
PFS page.
有關頁分派和頁的可用空間的信息
13
boot page.
記載了關於數據庫的信息,僅存於每一個數據庫的第9頁
15
file header page
記載了關於數據庫文件的信息,存於每一個數據庫文件的第0頁
16
DCM page
記載自從前次全備以來的數據轉變的頁面,以備差別備份
17
BCM page
有關每一個分派單位中自最初一條 BACKUP LOG 語句以後的年夜容量操作所修正的區的信息
現實上SQLServer還包含一些未地下的頁面類型,例如type 19,type 14等等。
本章我們重要引見GAM頁和SGAM頁,其他頁面類型會稍後引見。
那末若何檢查頁面信息呢,從SQLServer2000起便開端供給了一個讀取數據頁構造的敕令DBCC Page。該敕令為非文檔化的敕令,詳細以下:
DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
詳細參數描寫以下:
dbid 包括頁面的數據庫ID
dbname 包括頁面的數據庫的稱號
filenum 包括頁面的文件編號
pagenum 文件內的頁面
printopt 可選的輸入選項;選用個中一個值:
0:默許值,輸入緩沖區的題目和頁面題目
1:輸入緩沖區的題目、頁面題目(分離輸入每行),和行偏移量表
2:輸入緩沖區的題目、頁面題目(全體輸入頁面),和行偏移量表
3:輸入緩沖區的題目、頁面題目(分離輸入每行),和行偏移量表;每行後跟分離列出的它的列值
假如要想看到這些輸入的成果,還須要設置DBCC TRACEON(3604)。
如前文所述,GAM頁必定存在於該數據庫的第二個頁面,SGAM頁則必定存在於該數據庫的第三個頁面;而每個數據庫都邑存在文件編號為1的數據庫文件,所以我們履行以下敕令便可。
DBCC TRACEON(3604)
DBCC PAGE(TESTDB,1,2,1) —檢查GAM頁信息
DBCC PAGE(TESTDB,1,3,1) —檢查SGAM頁信息
DBCC PAGE(TESTDB,1,2,2) —檢查GAM頁信息和全體輸入頁面
DBCC PAGE(TESTDB,1,3,2) —檢查SGAM頁信息和全體輸入頁面
DBCC PAGE(TESTDB,1,2,3) —檢查GAM頁信息及響應列值
DBCC PAGE(TESTDB,1,3,3) —檢查SGAM頁信息及響應列值
DBCC PAGE(TESTDB,1,2,1) WITH TABLERESULTS —以表格情勢檢查SGAM頁信息及響應列值
DBCC PAGE(TESTDB,1,3,1) WITH TABLERESULTS —以表格情勢檢查SGAM頁信息及響應列值
我們可以看到一個完全的頁面分為四個部門;BUFFER、PAGE HEADER、DATA和OFFSET TABLE。
讓我們起首從GAM頁開端看起:
BUFFER部門:
顯示給定頁面的緩沖信息,是內存中的構造,用於治理頁面,該信息僅當該頁面處於內存時才成心義。關於這個部門我們知之甚少,根本上沒法找到相干資料。
BUF @0x03585CD8 每次清空緩存再次查詢,地址都邑轉變 bpage = 0x060B4000 每次清空緩存再次查詢,地址都邑轉變 bhash = 0x00000000 絕對不變 bpageno = (1:2) 以後頁面地址 bdbid = 8 sys.databases.database_id breferences = 1 每次清空緩存再次查詢,地址都邑轉變 bUse1 = 41490 每次清空緩存再次查詢,地址都邑轉變 bstat = 0xc00009 絕對不變 blog = 0x59ca2159 絕對不變 bnext = 0x00000000 絕對不變
PAGE HEADER部門:
PAGE HEADER部門顯示的是該頁面上的一切報頭字段的數據
PAGE HEADER這部門內容只要經由過程DBCC PAGE(TESTDB,1,2,2)即全體輸入頁面能力夠展示;經由過程與下面表格的對比,我們委曲能辨認一些相干存儲信息;當這部門缺少官方文檔的支撐,為了不無謂的猜想,所以臨時就不做深刻商量了。
DATA 部門
DATA部門普通分為若干插槽號(Slot),假如是數據頁或索引頁的話,可以懂得為一行記載,SQLServer經由過程文件號+頁面號+插槽號用來獨一標識表中的每筆記錄。但在GAM頁中我們可以把Slot 0懂得為GAM頁的保存頁,合計94個字節。
從第194個字節開端(頁面老是從第0個字節開端的),到第196個字節,這三個字節代表已分派的分區的情形。即0000C0。
我們再來看一下DBCC PAGE(TESTDB,1,2,3)的履行成果。
下面顯示從第1頁到第168頁已分派,而第176頁到272頁未分派,和DBCC PAGE(TESTDB,1,2,2)顯示的194個頁面仿佛有些抵觸,現實上是不抵觸的。如前文所述,GAM對未應用的分區標識為0,而對已分派的分區標識為1
1個分區=64頁,由於前128個頁面均已分派,所之前兩個字節為00 00
從第128個頁面起到第175個頁面也均已分派,現實上為6個區為0也就是說持續6個bit為0,一個字節為8個bit,最初兩個bit為11,所以該字節為0000 0011,在此須要反轉一下相干二進制位;反轉以後為1100 0000即為C0。
最初讓我們用Internals Viewer插件看一下GAM頁的全貌吧。
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頁的全貌吧。
總結一下,關於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頁面。