SQLSERVER數據存儲內幕

  SQLSERVER數據庫中數據如何存儲是SQLSERVER數據庫核心的知識,同時網絡上相關的參考資料也比較少!近段時間通過學習相關知識,將自己對SQLSERVER數據庫在數據存儲方面的理解整理下來,一方面希望能加深自己的印象,另一方面也希望能給其他的朋友提供相關的參考!

一:存儲文件類型
   
 SQLSERVER有兩種數據存儲文件,分別是數據文件和日誌文件。
  其中:數據文件是以8K(8192Byte)的頁面(Page)作爲存儲單元的。
  而日誌文件是以日誌記錄作爲存儲單元。

  本文只討論數據文件的存儲方式,不涉及到日誌文件存儲方式。

數據文件以頁面做爲存儲單元存儲數據,要理解數據文件的存儲方式,必須瞭解SQLSERVER中定義的頁面類型種類。

二:頁面類型
   SQLSERVER
中頁面類型有8,具體每種類型的詳細說明,見下圖:
  

用戶的數據一般存放在數據頁面中,由上圖可以看出,數據頁包含數據行中除 textntext p_w_picpath 數據外的所有數據,textntext p_w_picpath 數據存儲在單獨的頁中。那麼在一個數據頁面中,數據是如何存放,SQLSERVER又是根據什麼來定位頁面與頁面上的數據呢。要回答這個問題,有必要先了解數據頁面的具體結構。

 

三:數據頁面結構

   在數據頁上,數據行緊接着頁首按順序放置。在頁尾有一個行偏移表。在行偏移表中,頁上的每一行都有一個條目,每個條目記錄那一行的第一個字節與頁首的距離。行偏移表中的條目序列與頁中行的序列相反。數據頁面結構如下圖所示,下面將詳細解釋

其中:數據頁面頁首:96個字節,保存着頁面的系統信息,如頁的類型、頁的可用空間量、擁有頁的對象的對象 ID 以及該頁面所屬於哪個物理文件。
          
數據區:對應於上圖中所有數據行的總區域,存放真正的數據,是以Slot爲單位。一個Slot就是對應於一條數據記錄行,從0開始編號,16進制反序保存,Slot0,  Slot1....
         
行偏移數組:用於記錄該數據頁面中每個Slot在數據頁面所處的相對位置,便於定位和檢索每個Slot在數據頁面中的位置,數組中每個記錄佔兩個字節。

 

四:存儲分配單位:盤區(擴展 Extend)
     
雖然SQLSERVER中數據文件存儲單位是頁面(Page),但實際SQLSERVE並不是爲頁面爲單位給數據分配空間,SQLSERVER默認的存儲分配單位是盤區。這樣做的主要原因是爲了提高性能。爲了避免頻繁的讀寫IO,在表或其它對象分配存儲空間,不是直接分配一個8K的頁面,而是以一個盤區(Extend)爲存儲分配單位,一個盤區爲8個頁面(=88K64K)

但是這樣做雖然減少了頻繁的IO讀寫,提高的數據庫性能,但卻導致出一個新問題,那就是在存儲那些只有少量數據,不足8K的對象,如果也是分配給一個盤區,就會存在存儲空間上的浪費,降低了空間分配效率。

爲解決上述問題,SQLSERVER提供了一種解決方案,定義了兩種盤區類型,統一盤區和混合盤區。
      
其中:統一盤區只能存放同一個對象,該對象擁有這個盤區的所有頁面        
           
混合盤區:由多個對象共同擁有該盤區。
      
在實際爲對象分配存儲盤區時,爲了提高空間利用率,默認的情況下,如果一個對象一開始大小小於8個頁面,就儘量放在混合盤區中,如果該對象大小增加到8個頁面後,SQLSERVER會爲這個對象重新分配一個統一盤區。

爲了能夠通過上述策略來實現爲對象分配存儲盤區,SQLSERVER提供了GAM/SGAM機制來管理和維護數據文件的盤區信息。

其中:

  • 全局分配映射表 (GAM)

GAM 頁記錄已分配的盤區,包括統一盤區和混合盤區。每個GAM 包含 64,000 個盤區,將近 4 GB 的數據。GAM 對所涵蓋區間內的每個盤區都有一位。如果這個位是 1,則盤區未分配(可用);如果這個位是 0,則盤區已分配。

  • 共享全局分配映射表 (SGAM)

SGAM 頁只記錄混合盤區,這些盤區當前用作混合盤區而且至少有一個未使用的頁。每個 SGAM 包含 64,000 個擴展盤區,將近 4 GB 的數據。SGAM 對所涵蓋區間內的每個擴展盤區都有一位。如果這個位是 1,則該擴展盤區就用作混合擴展盤區且有可用的頁;如果這個位是 0,則該擴展盤區不用作混合擴展盤區,或者雖然用作混合擴展盤區但其所有頁都正在使用中。

 

根據擴展盤區的當前使用情況,每個擴展盤區在 GAM SGAM 中有以下位模式設置。

          

     

      通過這樣的策略簡化了盤區管理算法。若要分配統一盤區,SQL Server GAM 中搜索是 1 的位,然後將它設成 0。若要查找有可用頁的混合盤區,SQL Server SGAM 中搜索是 1 的位。若要分配混合盤區,SQL Server GAM 中搜索是 1 的位,並將它設置爲 0,然後將 SGAM 中相應的位也設置爲 1。若要釋放盤區,SQL Server 應確保 GAM 位設置爲 1 而且 SGAM 位設置爲 0SQL Server 內部實際使用的算法比這裏敘述的算法要複雜(SQL Server 在數據庫中均勻分佈數據),,但道理大致如此。

 

 

五:查看實際的數據頁面信息

  數據存儲相關的知識大致如上所述,理論性較強,但我們可以通過未公開的DBCC命令,直接查看某個數據頁面的內容,得到直觀上的數據存儲信息。
     
具體是通過使用DBCC命令:DBCC PAGE.
     
簡單的使用例子如下:
   //
查看數據頁面的內容的方法
   
--打開查看數據頁面的開關
    dbcc traceon(3604) //
打開跟蹤標記
    dbcc Page(northwind,1,100,1) //
打開northwind數據庫,第101個頁面的信息

 

至於如何通過DBCC PAGE命令查看某個頁面信息,以及頁面信息如何查看,請參考以下鏈接:

[url]http://boyi55.blog.51cto.com/4345/26959[/url]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章