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。次要次要資料檔案是可選的,由使用者定義並儲存使用者資料。通過將每個檔案放在不同的磁碟驅動器上...