SQLSERVER資料儲存內幕

2022-03-16 13:18:55 字數 3492 閱讀 8166

sqlserver

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

一:儲存檔案型別

sqlserver有兩種資料儲存檔案,分別是資料檔案和日誌檔案。

其中:資料檔案是以8k(=8192byte)的頁面(page)作為儲存單元的。

而日誌檔案是以日誌記錄作為儲存單元。

本文只討論資料檔案的儲存方式,不涉及到日誌檔案儲存方式。

資料檔案以頁面做為儲存單元儲存資料,要理解資料檔案的儲存方式,必須了解sqlserver中定義的頁面型別種類。

二:頁面型別

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

使用者的資料一般存放在資料頁面中,由上圖可以看出,資料頁包含資料行中除text、ntext 和image 資料外的所有資料,text、ntext 和image 資料儲存在單獨的頁中。那麼在乙個資料頁面中,資料是如何存放,sqlserver又是根據什麼來定位頁面與頁面上的資料呢。要回答這個問題,有必要先了解資料頁面的具體結構。

三:資料頁面結構

在資料頁上,資料行緊接著頁首按順序放置。在頁尾有乙個行偏移表。在行偏移表中,頁上的每一行都有乙個條目,每個條目記錄那一行的第乙個位元組與頁首的距離。行偏移表中的條目序列與頁中行的序列相反。

資料頁面結構如下圖所示,下面將詳細解釋

其中:資料頁面頁首:96個位元組,儲存著頁面的

系統資訊,如頁的型別、頁的可用空間量、擁有頁的物件的物件id 以及

該頁面所屬於哪個物理檔案。

資料區:對應於上圖中所有資料行的總區域,存放真正的資料,是以

slot

為單位。乙個

slot

就是對應於一條資料記錄行,從

0開始編號,以

16進製制反序儲存

,slot0,  slot1....

。行偏移陣列:用於記錄該資料頁面中每個

slot

在資料頁面所處的相對位置,便於定位和檢索每個

slot

在資料頁面中的位置,陣列中每個記錄佔兩個位元組。

四:儲存分配單位:盤區(擴充套件

extend)

雖然sqlserver

中資料檔案儲存單位是頁面

(page),

但實際sqlserve

並不是為頁面為單位給資料分配空間,

sqlserver

預設的儲存分配單位是盤區。這樣做的主要原因是為了提高效能。為了避免頻繁的讀寫

io,在表或其它物件分配儲存空間,不是直接分配乙個

8k的頁面,而是以乙個盤區

(extend)

為儲存分配單位,乙個盤區為

8個頁面

(=8*8k=

64k)

。但是這樣做雖然

減少了頻繁的

io讀寫,提高的資料庫效能,但卻導致出乙個新問題,那就是在儲存那些只有少量資料,不足

8k的物件,如果也是分配給乙個盤區,就會存在儲存空間上的浪費,降低了空間分配效率。

為解決上述問題,

sqlserver

提供了一種解決方案,定義了兩種盤區型別

,統一盤區和混合盤區。其中:

統一盤區只能存放同乙個物件,該物件擁有這個盤區的所有頁面  

混合盤區:由多個物件共同擁有該盤區。

在實際為物件分配儲存盤區時,為了提高空間利用率,預設的情況下,如果乙個物件一開始大小小於

8個頁面,就盡量放在混合盤區中,如果該物件大小增加到

8個頁面後,

sqlserver

會為這個物件重新分配乙個統一盤區。

為了能夠通過上述策略來實現為物件分配儲存盤區,

sqlserver

提供了gam/sgam

機制來管理和維護資料檔案的盤區資訊。

其中:gam

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

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

位設定為0。

sql server

內部實際使用的演算法比這裡敘述的演算法要複雜(

sql server

在資料庫中均勻分布資料),

,但道理大致如此。

五:檢視實際的資料頁面資訊

資料儲存相關的知識大致如上所述,理論性較強,但我們可以通過未公開的

dbcc

命令,直接檢視某個資料頁面的內容,得到直觀上的資料儲存資訊。

具體是通過使用

dbcc

命令:dbcc page.

簡單的使用例子如下:

//檢視資料頁面的內容的方法

--開啟檢視資料頁面的開關

dbcc traceon(3604) //

開啟跟蹤標記

dbcc page(northwind,1,100,1) //

開啟northwind

資料庫,第

101個頁面的資訊

至於如何通過dbcc

本文出自 「我兒子真帥!

」 部落格,請務必保留此出處

本文出自 51cto.com技術部落格

SQL Server技術內幕筆記合集

microsoft sql server 6.5 技術內幕 筆記 microsoft sql server 2005技術內幕 t sql查詢筆記 microsoft sql server 2005技術內幕 儲存引擎筆記 microsoft sql server 2005技術內幕 查詢 調整和優化筆記...

SQL Server技術內幕筆記合集

microsoft sql server 6.5 技術內幕 筆記 microsoft sql server 2005技術內幕 t sql查詢筆記 microsoft sql server 2005技術內幕 儲存引擎筆記 microsoft sql server 2005技術內幕 查詢 調整和優化筆記...

SQL Server中資料的儲存

參考 檔案說明 主要主要資料檔案包含資料庫的啟動資訊,並指向資料庫中的其他檔案。使用者資料和物件可儲存在此檔案中,也可以儲存在次要資料檔案中。每個資料庫有乙個主要資料檔案。主要資料檔案的建議副檔名是 mdf。次要次要資料檔案是可選的,由使用者定義並儲存使用者資料。通過將每個檔案放在不同的磁碟驅動器上...