SQL Server 理解GAM和SGAM頁

2021-09-22 20:31:27 字數 3880 閱讀 3395

原文:

sql server :理解gam和sgam頁

我們知道sql server在8k 的頁裡儲存資料。分割槽就是物理上連續的8個頁。當我們建立乙個資料庫,資料檔案會被邏輯分為頁和區,當使用者物件建立時,頁會分配給它用來儲存資料。gam(global allocation map)和sgam(shared global allocation map)頁用來跟蹤sql server裡空間分配情況。這裡我們會一起討論下sql server的空間分配,還有gam和sgam怎麼幫助我們分配空間。

在sql server裡有2類區:

統一區(uniform extent):區屬於乙個使用者物件。這些區的所有8頁歸乙個物件所有。

混合區(mixed extent):區屬於各個使用者物件。即區里的每個頁都可以屬於不同使用者物件。

為了更好的管理空間分配,如果乙個表或索引大小小於8頁(即64k),sql server會分配混合區的頁,而不是統一區的頁。

我們在sql server裡驗證下。

新建乙個表(這個表剛好一條記錄乙個頁面),並插入26條記錄,並通過dbcc ind檢視這個表的相關頁面:

從上圖我們可以清楚的看到,綠色區域的第乙個8頁不屬於同個區(混合區),因為頁面號不連續,204餘206之間有缺口,207餘94752之間也有缺口。接下來藍色紅色區域是屬於同個區(統一區),因為它們的頁面號是連續的。當我們以碎片級別來看待這個情況時,可以發現表越小,碎片越高。即使你用索引重建,這個高碎片也不會減少。這個背後的原因就是sql server分配新的表或索引物件時,總是首先從混合區分配空間。

sql server為新錶或索引從混合區開始分配頁。一旦表增長超過8頁。sql server需要從統一區分配頁。當表或索引為新的或修改的資料需要更多的容納空間時,sql server需要這些表或索引分配頁。如果表或索引的大小小於8頁。sql sever需要從混合區給它們分配空間。如果大小超過8頁,sql server需要從統一區分配頁。sql使用2類不同的頁來更好管理這個分配操作。

全域性分配對映表(gam: global allocation map pages):gam頁記錄哪些些區已被使用分配。對於每個區,gam都有乙個位。如果這個位是1,表示對應的區是空閒可用的。如果這個位是0,表示對應區被統一區或混合區使用。乙個gam頁可以儲存64000個區的使用資訊。這就是說,乙個gam可以儲存近4g(64000 * 8 * 8/ 1024)資料檔案的使用資訊。簡單來說,乙個7g的資料檔案會有2個gam頁。

共享全域性分配對映表(sgam: shared global allocation map pages):sgam頁記錄哪些區已被作為混合區使用並至少有乙個可用的空閒頁。對於每個區,sgam都有乙個位。如果這個位是1,表示對應的區作為混合區使用並至少有乙個可用的空閒頁。如果這個位是0,表示這個區既沒被混合區使用(作為統一區),或這個區的所有頁都作為混合區使用了。乙個sgam頁可以儲存64000個區的使用資訊。這就是說,乙個sgam可以儲存近4g(64000 * 8 * 8/ 1024)資料檔案的使用資訊。簡單來說,乙個7g的資料檔案會有2個sgam頁。

gam和sgam頁幫助資料庫引擎進行區管理。分配乙個區,資料庫引擎查詢標記1的gam頁,然後標記為0。如果那個區是作為混合區分配,它會在sgam頁把對應區的標記為1。如果那個區是作為統一區分配,那就沒有必要在sgam裡修改對應位標記。找乙個有空頁的混合區,資料庫引擎在sgam頁查詢標記為1的位。如果沒找到,資料檔案已經滿了。解除乙個區分配,資料庫引擎會把對應gam頁裡對應位設定為1,sgam頁裡對應標記設定為0。

在每個資料檔案裡,第3個頁(頁號2,頁號從0開始)是gam頁,第4個頁(頁號3,頁號從0開始)是sgam頁。第1個頁(頁號0)是檔案頭(file header),第2個頁(頁號1)是pfs(page free space)頁。我們可以使用dbcc page命令檢視gam和sgam頁。

我們在adventureworks2008r2資料庫裡驗證下:

1

useadventureworks2008r223

dbcc traceon(3604)4

go5dbcc page('

adventureworks2008r2

',1,2,3)

輸出的結果最後乙個部分:

第1行表示,在頁0到頁23112之間的區都已經被分配,也就是說頁號從0到23129的頁都被分配。

第2行表示,在頁23120到頁25072之間的區都沒被分配,也就是說頁號從22120到頁25079的頁都未被分配。

可以看到在gam頁的分配資訊和在對應頁裡頁頭的分配資訊(allocation statu)是一致的。

我們來看看sgam頁的分配情況:

第1行表示,在頁0到頁11752之間的區都已經未被分配,也就是說這些區沒被分配,或者是統一區,或者是沒有空頁的混合區,這裡應該是統一區。

第2行表示,自頁11760的區開始是混合區,並且至少有1個可用的頁。

SQLServer 理解copyonly備份操作

alwayson在新增資料庫的過程中如果同步首選項選擇的是 完整 那麼就會在主副本上執行copyonly的完整備份和日誌備份在輔助副本上執行還原操作,也正是這個操作讓我對copyonly有了新的理解。雖然以前也經常使用copyonly執行完整備份,但是之前對copyonly的理解存在一點誤區。接下來...

理解SQL Server系統表sysobjects

這就讓sysobjects 有了用武之地。雖然我不建議你更新這個 但是你當然有權對其進行審查。在大多數情況下,對你最有用的兩個列是sysobjects.name和sysobjects.xtype。前面乙個用來列出待考察物件的名字,而後乙個用來定義物件的型別,其 如下 c 檢查約束。d 預設的約束 f...

SQL SERVER中架構的理解

在sqlserver 2005中,可能大家在工作或學習的時候會經常發現這樣一些問題,你使用乙個賬戶在資料庫中建立了一張表,卻發現你自己建立的表卻沒有修改和查詢的許可權,這是一件很鬱悶的事情,在sqlserver2000中卻不存在這樣的問題,那為什麼在2005中會出現這樣的事情,這樣的設定可以帶來哪些...