程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL2008 >> SQL Server 2008存儲構造之GAM、SGAM引見

SQL Server 2008存儲構造之GAM、SGAM引見

編輯:MSSQL2008

SQL Server 2008存儲構造之GAM、SGAM引見。本站提示廣大學習愛好者:(SQL Server 2008存儲構造之GAM、SGAM引見)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 2008存儲構造之GAM、SGAM引見正文


當我們創立一個數據庫的時刻,例如以缺省的方法CREATE DATABASE TESTDB,SQLServer主動幫我們創立好以下兩個數據庫文件。

這兩個數據文件是實其實在的操作體系文件,個中一個是叫行數據文件,用來存儲數據庫的各類對象,別的一個是日記文件,歷來記載數據變更的進程。

  從邏輯角度而言,數據庫的最小存儲單元為頁即8kb。

  數據庫被分紅若干邏輯頁面(每一個頁面8KB),而且在每一個文件中,一切頁面都被持續地從0到x編號,個中x是由文件的年夜小決議的。我們可以經由過程指定一個數據庫ID、一個文件ID、一個頁碼來援用任何一個數據頁。每一個數據頁則用來存儲表和索引,和相干的數據庫治理信息。

  我們順著下面數據文件的途徑可以找到該文件,不雅察一下新建的數據文件的年夜小為:

  2.18 MB (2,293,760 字節)=2,293,760b/8kb=280個頁面=35個區

  數據庫停止空間治理的最小單元為區(extents)。

  一個區由8個邏輯上持續的頁面構成(64KB的空間)。為了可以或許更有用地分派空間,SQL Server 2008不會為大批的數據向數據表分派整區的空間。SQL Server 2008有兩品種型的區。

  同一類型的區 這些區為單個對象一切,區中一切的8個數據頁只能被所屬對象應用。

  混雜類型的區 這些區能為最多8個對象同享。

  SQL Server為新的表或索引從混雜類型的區平分配頁面。當該表或索引增加到8個頁面時,今後一切的分派都應用同一類型的區。

  當一張表或一個索引須要更多的空間時,SQL Server須要找到可以或許用來分派的空間。假如該表或索引全體依然少於8個頁面,SQL Server必需找到可以或許用來分派的混雜類型區組成的空間。假如表或索引有8個頁面或更年夜,SQL Server必需找到一個自在的同一類型的區。

  SQL Server應用兩種特別類型的頁面來記載哪些區曾經被分派出去了,哪些類型(混雜類型或同一類型)的區可供應用:

  全局分派映照(Global Allocation Map,GAM)頁面 這些頁面記載了哪些區曾經被分派並用作何種用處。一個GAM頁面在它所籠罩空間裡針對每個區都有一個數據位。假如數據位為0,那末對應的區正在應用;假如該數據位為1,那末該區為自在區。一個GAM頁面除頁面頭部和其他一些須要記入的開支年夜概有8 000字節或許說64 000位空間可用,所以每一個GAM頁面可以籠罩64 000個區,也就是年夜約4GB的數據。這意味著一個文件的每4GB空間對應一個GAM頁面。

  同享全局分派映照(Shared Global Allocation Map,SGAM)頁面 這些頁面記載了哪些區以後被用作混雜類型的區,而且這些區需含有至多一個未應用的頁面。就像一個GAM頁面,每個SGAM頁面籠罩了年夜約64 000個區,也就是年夜約4GB的數據。一個SGAM頁面在它所籠罩空間裡針對每個區都有一個數據位。假如數據位為1,那末對應的被應用的區為混雜類型,而且該區有一些自在頁面;假如數據位為0,那末對應的區不是一個混雜類型的區,或許固然是一個混雜類型的區,然則一切的頁面都已被應用了。

  表4-2顯示了基於每個區以後的應用情形,在GAM和SGAM中該區所對應的比特位形式。
區確當前應用情形 GAM比特位設置 SGAM比特位設置 自在,未應用 1 0 同一類型或已全體應用的混雜區 0 0 含有自在頁面的混雜區 0 1

  假如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頁面。

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