SQL Server數據行的物理空間分配

SQL Server數據行的物理空間分配數據庫

104344808.png


1、頁(page)數組

一、基本概念ide

  頁是SQL Server存儲數據的基本單位,每一頁爲8KB(8192字節)。頁是SQL Server能夠讀寫的最小I/O單位,即便只訪問一行,SQL Server也要讀取整個頁。指針


093619821.png

  SQL Server有如下8種類型的頁日誌

(1)數據頁:是保存除text/ntext/p_w_picpath類型外的數據行對象

(2)索引頁:保存索引信息blog

(3)頁面可用空間(PFS:Page Free Space)頁:保存可用頁空間信息,Page ID=1 。索引

(4)文本/圖像頁:保存text/ntext/p_w_picpath類型的數據get

(5)全局分配映射(GAM)頁:保存已經分配的盤區信息,Page ID=2 。SGAM,Page ID=3 。it

(6)索引分配映射頁(IAM):保存一個表或索引使用的盤區信息

(7)批量修改映射(BCM:Bulk Changed Map)頁:保存在上次backup   log時執行批量操做所修改的盤區信息,Page ID=7 。

(8)差量修改映射(DCM:Differential Changed Map)頁:保存上次backup database差別備份時所修改的盤區信息,Page ID=6 。


二、數據頁

(1)標頭(Header)

  每個數據頁都包含一個96字節的標頭,SQL Server 2005使用了64字節,其它32字節做爲保留。標頭包含的信息以下(摘自《深刻解析SQL Server 2008》)

112152469.png


(2)數據行(data row)

  數據行緊跟在標頭以後,數據行的最大長度是8060字節。 因爲數據庫不能「跨頁」,所以單行數據最多8060字節,但對於可變長對象與LOB對象有特殊的處理方法從而能夠「跨頁」。

  注意:每一行的數據內容最多不能超過8053,由於SQL Server還須要對每一行的數據最少附加7字節的系統數據。


(3)行偏移矩陣(row offsets)

  頁的末尾是行偏移矩陣,又譯爲行偏移數組,或行指針,它最少佔用36字節。

  每一數據行都對應一個條目塊(Entity Block),每一個條目塊由2個字節構成,記錄該數據行的第一個字節與頁首的距離。行偏移矩陣中的條目順序與數據行的順序相反,並且只表示了頁中數據行的邏輯順序。注意:行的物理位置能夠是頁面上的任意位置。若是是彙集表,行偏移矩陣的slot0引用匯集索引鍵順序中的第一行,slot1引用第二行,依此類推。

  行偏移矩陣最少爲36字節,所以默認最多隻能夠記錄18個數據行。當數據行超過18行時,系統將動態調整數據行佔用的字節數與行偏移矩陣佔用的字節數,注意:數據行與行偏移矩陣總共是8096字節。


三、行數據存儲結構

(1) 數據行的限制

  在舊版本的SQL Server中,行不能跨頁,並且被限制爲8060字節(Text、Image類型的LOB除外),還要考慮留有足夠的空間存儲行偏移矩陣的條目塊。

(2)行溢出數據(row-overflow data)

  SQL Server 2005新行性,對於含有VarChar(舊版本爲text)、NVarchar(舊版本爲ntext)、VarBinary(舊版本爲p_w_picpath)、SQL_Variant、CLR用戶定義類型的數據行,能夠超過這一限制。當行超過8060字節時,這些類型的值將被移動到一個「行溢出分配單元」的頁中,而在原始頁中保留一個24字節的指針,指向行外的數據。這樣,行能夠跨頁,但行內數據仍然被限制爲8060字節。

  當這些數據的大小不超過8000字節時,它們的值將被移動到行溢出頁中。若是數據的大小超過了8000字節,這些值將被內部處理爲一個LOB(large object),而在原始行上維護一個16字節的指針,指向該LOB。


四、行數據的存儲類型

  SQL Server有3種存儲類型:

(1)行內數據(IN_ROW_DATA)的頁面

(2)行溢出數據(ROW_OVERFLOW_DATA)的頁面

(3)LOB數據(LOB_DATA)的頁面


2、區(Extend)

一、基本概念

  區,也譯爲擴展,或盤區,是8個物理上連續的頁組成的單元,即64KB的空間,用於存儲表和索引。 SQL Server 2008有兩種類型的區:

(1)統一區。由單個對象擁有,只有該對象可使用該區中的8個頁面。當表或索引須要更多的空間以存儲數據時,SQL Server爲對象分配一個完整的區。

(2)混合區。每一個頁面可由一個對象擁有,所以一個混合區最多可由8個對象擁有。對於包含少許數據的對象且不足64KB時,當它須要更多空間時,SQL Server一般只分配一個單獨的頁,而不是整個區。這個頁能夠位於一個混合區內。

  因爲I/O負載多數消耗在磁盤尋址方面,所以讀取一個連續8個頁面的區,與讀取一個頁,所用的時間幾乎同樣多。SQL Server對一些大型表或索引的掃描,能夠在區級別上讀取數據。


二、區的分配記錄

  SQL Server用兩種特殊的頁面記錄已經分配了哪些區,以及區能夠用於哪些類型(混合或統一)。

(1)全局分配映射(GAM)頁面

  記錄了能夠分配給任何用途的區。GAM對它所涵蓋的每一個區都有一個位(bit),以0表示正在使用中,以1表示可用。每一個GAM頁面,除去頭文件等,有8000字節(64000位)可用。所以每一個GAM頁能夠涵蓋64000個區,即4GB。

  GAM老是任何數據庫文件的第3個頁面(Page ID=2),這個頁面以後,每511230個頁面就會有一個GAM頁面。

(2)共享全局分配映射(SGAM)頁面

  記錄了用做混合區的區,而且這些區中至少有一個未使用的頁。結構與GAM相似,每一個區都有一個位,以1表示是混合區而且可用,以0表示沒有用做混合區或頁面都已被使用。對於這個區,GAM對應的位的值老是爲0。每一個SGAM頁能夠涵蓋64000個區,即4GB。

  SGAM老是任何數據庫文件的第4個頁面(Page ID=3),這個頁面以後,每511230個頁面就會有一個SGAM頁面。

  當對錶進行Drop或Truncate時,將釋放整個區(將GAM位設置爲1,將SGAM位設置爲0),這樣會使日誌記錄最小。


三、分配新的區

  若是SQL Server須要找到新的、徹底未使用的區,它能夠從GAM頁中找到值爲1的位。

  若是SQL Server須要找到包含可用空間的混合區(有一個或多個可用的頁面),則它在SGAM中尋找值爲1 的位。若是沒有找到具備可用的頁的混合區,SQL Server會使用GAM頁找到一個全新的區,將它分配爲混合區,而後使用其中一個頁。若是根本沒有可用的區,說明文件已經滿了。


、索引分配映射(IAM)

  IAM頁面記錄表或索引使用的區,它包括3種分配單元(即:行數據的3種存儲類型)之一的頁面。單個IAM頁面只包括單個文件的4GB的區的分配信息,若是表或索引的分區使用了多個文件,就會有多個IAM頁面。 例如:具備3種存儲類型(行中存儲、行溢出和LOB)的4個分區,每一個分區都有2個小於4GB文件,那麼將有24個IAM頁面。若是數據庫文件超過4GB,就會有額外的IAM。

  每一個IAM是按對象的須要進行分配的,且在數據庫文件中隨意放置。每一個IAM頁面都包含一個指針,指向鏈中的下一個IAM頁面。


4、PFS

  頁可用空間(PFS)頁面記錄每頁的分配狀態,將區分配給對象後,數據庫引擎 將使用PFS頁來記錄區中的哪些頁已分配或哪些頁可用。PFS 對每頁都有一個字節,記錄該頁是否已分配。若是已分配,則記錄該頁是爲空、已滿 1% 到 50%、已滿 51% 到 80%、已滿 81% 到 95% 仍是已滿 96% 到 100%。


5、DCM與BCM

  DCM(差分更改映射)和BCM(批量更改映射)頁面與GAM和SGAM頁面相似,其中有一個位對應於它們所表明的數據庫文件中的每一個區。它們以固定間隔出現,每隔511230頁出現一次。

相關文章
相關標籤/搜索