以文本方式查看主題 - 安易免費財務軟件交流論壇 (http://m.gangyx.cn/bbs/index.asp) -- 電腦知識交流 (http://m.gangyx.cn/bbs/list.asp?boardid=11) ---- SQL Server 2008存儲結構之GAM、SGAM (http://m.gangyx.cn/bbs/dispbbs.asp?boardid=11&id=32400) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-- 作者:炙天 -- 發布時間:2011/1/13 8:41:44 -- SQL Server 2008存儲結構之GAM、SGAM 談到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中該區所對應的比特位模式。
如果SQL Server需要找到一個新的完全沒有使用的區,那么它可以使用任何一個在GAM頁面中對應的比特位值為1的區。如果SQL Server需要找到一個有著可用空間(有一個或多個自由頁面)的混合類型的區,那么它可以尋找一個對應的GAM中的值為0、SGAM中的值為1的區。如 果不存在有可用空間的混合類型的區,SQL Server會使用GAM頁面來尋找一個全新的區并將其分配為混合類型的區,然后使用該區中的一頁。如果根本沒有自由區,那么這個文件已經滿了。
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頁,即和我們看到的數據庫數據文件的大小完全相等。
以下截圖是通過SQLServer2008的Internals Viewer插件看到的整體頁面結構,該插件是從http://www.SQLInernalsViewer.com網站下載的,分為不同的.net版本。 備注:TESTDB為新創建的空數據庫,沒有任何用戶自定義對象,直到有建表腳本為止; 關于數據庫頁類型如下所示:
實際上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的數據庫文件,所以我們執行以下命令即可。 |