GAM、SGAM、PAM、IAM、DCM 和 BCM 都是 SQL Server 中用來管理空間分配的一些特殊分配映射表。理解他們的區別與作用,對於理解 Sql Server 物理資料庫體繫結構有著非常重要的作用。
Sql Server 區的管理(GAM,SGAM)
全域分配映射表 (GAM) :統一盤區,GAM 頁記錄已指派的區。每個 GAM 包含 64,000 個區,相當於近 4 GB 的資料。GAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區可用;如果位為 0,則區已指派。
共用全域分配映射表 (SGAM) :由多個對象共同擁有該盤區,SGAM 頁記錄當前用作混合區且至少有一個未使用的頁的區。每個 SGAM 包含 64,000 個區,相當於近 4 GB 的資料。SGAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區正用作混合區且有可用頁。如果位為 0,則區未用作混合區,或者雖然用作混合區但其所有頁均在使用中。
Sql Server 可用空間的管理(PFS)
PFS(Page Free Space):也叫頁面自由空間,該頁面用來跟蹤一個檔案中每一個特定的頁面的利用率情況,是以頁為單位的。一個檔案中第二個頁面(頁碼1)就是PFS頁面,該頁面的每個位元組都記錄了相應頁面的分配情況、頁面類型、是否IAM頁、是否包含刪除記錄、以及空間利用率資訊;PFS能夠管理和跟蹤8088個頁面的使用方式,即接近64M的空間,以後每8088個頁面將再出現一次。
Sql Server 對象使用空間的管理(PFS)
"索引配置對應 (IAM)"頁:將映射配置單位使用的資料庫檔案中 4 GB 部分中的區。主要用來標示 Sql Server 對象使用了哪些區。比如A表的非叢集索引B佔用了 7895 4個區。這樣,在再對此對象做更改的時候,能夠快速的找到這4個區,變更檔。
當 SQL Server 資料庫引擎必須在當前頁中插入新行,而當前頁中沒有可用空間時,它將使用 IAM 和 PFS 頁尋找要將該行分配到的頁,或者(對於堆或 Text/Image 頁)尋找具有足夠空間容納該行的頁。資料庫引擎使用 IAM 頁尋找分配給配置單位的區。對於每個區,資料庫引擎將搜尋 PFS 頁,以查看是否有可用的頁。每個 IAM 和 PFS 頁覆蓋大量資料頁,因此一個資料庫內只有很少的 IAM 和 PFS 頁。這意味著 IAM 和 PFS 頁通常位於記憶體中的 SQL Server 緩衝池中,所以能夠很快找到它們。對於索引,新行的插入點由索引鍵設定。在這種情況下,不會出現上述搜尋過程。
Sql Server 對已修改區得管理(DCM、BCM)
差異更改映射表 (DCM) :
這樣便可以跟蹤自上次執行 BACKUP DATABASE 語句後更改過的區。如果擴充盤區的位是 1,則自上次執行 BACKUP DATABASE 語句後擴充盤區已被修改。如果位是 0,則擴充盤區沒有被修改。
差異備份唯讀取 DCM 頁便可以確定已修改的區。這樣大大減少了差異備份必須掃描的頁數。運行差異備份所需的時間與自上次執行 BACKUP DATABASE 語句之後修改的區數成正比,而不是與整個資料庫的大小成正比。
大容量更改映射表 (BCM) :
跟蹤自上次執行 BACKUP LOG 語句後,被大容量日誌記錄操作修改的區。如果某個擴充盤區的位是 1,表明自上次執行 BACKUP LOG 語句後,該擴充盤區已經被有日誌記錄的大量複製操作修改。如果位是 0,則該擴充盤區未被有日誌記錄的大量複製操作修改。
儘管所有資料庫中都顯示 BCM 頁,但只有在資料庫使用大容量日誌記錄復原模式時,才會與 BCM 頁有關。在此復原模式中,當執行 BACKUP LOG 時,備份進程將掃描 BCM 尋找已經修改的區。然後,將那些區包括在記錄備份中。如果資料庫從Database Backup和一系列交易記錄備份恢複,便可以恢複大容量日誌記錄操作。在使用簡單復原模式的資料庫中,BCM 頁是不相關的,因為大容量日誌記錄操作不記入日誌。在使用完整復原模式的資料庫中,BCM 頁同樣不相關,因為該復原模式將大容量日誌記錄操作視為有完整記錄的操作。
DCM 頁和 BCM 頁的間隔與 GAM 和 SGAM 頁的間隔相同,都是 64,000 個區。在物理檔案中,DCM 和 BCM 頁位於 GAM 和 SGAM 頁之後。