<address id="thnfp"></address>

    <address id="thnfp"><th id="thnfp"><progress id="thnfp"></progress></th></address>
    <listing id="thnfp"><nobr id="thnfp"><meter id="thnfp"></meter></nobr></listing>
    以文本方式查看主題

    -  安易免費財務軟件交流論壇  (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中該區所對應的比特位模式。

    區的當前使用情況GAM比特位設置SGAM比特位設置
    自由,未使用10
    統一類型或已全部使用的混合區00
    含有自由頁面的混合區01

       如果SQL Server需要找到一個新的完全沒有使用的區,那么它可以使用任何一個在GAM頁面中對應的比特位值為1的區。如果SQL Server需要找到一個有著可用空間(有一個或多個自由頁面)的混合類型的區,那么它可以尋找一個對應的GAM中的值為0、SGAM中的值為1的區。如 果不存在有可用空間的混合類型的區,SQL Server會使用GAM頁面來尋找一個全新的區并將其分配為混合類型的區,然后使用該區中的一頁。如果根本沒有自由區,那么這個文件已經滿了。

    第0頁第1頁第2頁第3頁第4頁第5頁第6頁第7頁
    m_type=15m_type=11m_type=8m_type=9m_type=0m_type=0m_type=16m_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=1m_type=13m_type in (1,2,10)N/A
    Data頁Boot頁主要為內部系統表相關信息未分配

      以下截圖是通過SQLServer2008的Internals Viewer插件看到的整體頁面結構,該插件是從http://www.SQLInernalsViewer.com網站下載的,分為不同的.net版本。

      備注:TESTDB為新創建的空數據庫,沒有任何用戶自定義對象,直到有建表腳本為止;

    圖片點擊可在新窗口打開查看

     關于數據庫頁類型如下所示:



    類型頁面類型名稱頁面類型描述
    1Data page堆表和聚集索引的葉子節點數據
    2Index page聚集索引的非葉子節點和非聚集索引的所有索引記錄
    3Text mixed pageA 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.
    4Text tree pageA text page that holds large chunks of LOB values from a single column value.
    7Sort page排序時所用到的臨時頁,排序中間操作存儲數據用的。
    8GAM page全局分配映射(Global Allocation Map,GAM)頁面 這些頁面記錄了哪些區已經被分配并用作何種用途。
    9SGAM page共享全局分配映射(Shared Global Allocation Map,GAM)頁面 這些頁面記錄了哪些區當前被用作混合類型的區,并且這些區需含有至少一個未使用的頁面。
    10IAM page.有關每個分配單元中表或索引所使用的區的信息
    11PFS page.有關頁分配和頁的可用空間的信息
    13boot page.記錄了關于數據庫的信息,僅存于每個數據庫的第9頁
    15file header page記錄了關于數據庫文件的信息,存于每個數據庫文件的第0頁
    16DCM page記錄自從上次全備以來的數據改變的頁面,以備差異備份
    17BCM 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的數據庫文件,所以我們執行以下命令即可。


    Channel