這段時間談了很多頁,現在我們可以看下這些頁在數據文件里是如何組織的。
我們都已經知道,SQL Server把數據文件分成8k的頁,頁是IO的最小操作單位。SQL Server把數據文件里的第1頁標記為0。在所有數據庫文件里,前面的9個頁面(到頁號8)都是如下顯示一樣的順序,第10個頁(頁號9)是啟動頁,用來保存數據庫的元數據信息。
第1個頁,頁號0,是文件頭(page type 15)。它保存着文件頭信息。每個數據文件只有一個文件頭頁,而且是第0頁的位置。文件頭頁里保存着數據文件信息,例如文件大小,最小大小,最大大小和文件增長方式等。
第2個頁,頁號1,是第一個PFS頁(page type 11)。PFS頁在數據文件里是第2個頁(頁號1),緊跟在文件頭后(頁號0)。GAM和SGAM用來跟蹤區分配狀態,PFS頁用來跟蹤頁分配級別。當分配頁面的時候,數據庫引擎使用GAM和SGAM來識別有空頁的區。一旦數據庫引擎找到有空頁的區,它使用PFS頁來識別區里空頁的可用空間量。可用空間只在保存LOB值(ie text/image, varchar(max),nvarchar(max),varbinary(max) ,row overflow data)或堆表頁時跟蹤。默認情況下,LOB數據保存在一個獨立的頁,在原頁保存一個指向獨立頁的指針。這些就是數據能夠保存的空頁。對於索引頁,因為數據的保存順序和索引順序是一致的,因此沒有必用使用到PFS頁。PFS頁每8088個頁重復一個。這就是說第1頁,第8088頁,第16176頁,第24264頁……在每個數據文件里都是PFS頁。SQL Server: 理解PFS頁。
第3個頁,頁號2,是第一個GAM頁(page type 8)。GAM頁用來跟蹤哪些區被使用。每個區對應GAM頁的一個位。如果這個位的值是1,對應區是空、可用的,如果這個位的值是0,對應區是作為統一區或混合區使用。一個GAM頁可以保存接近64000個區的信息。那就是說,一個GAM頁可以保存(64000 * 8 * 8)/1024 = 4000 MB的信息。簡而言之,一個7GB大小的數據文件將有2個GAM頁。SQL Server : 理解GAM與SGAM頁。
第4個頁,頁號3,是第一個SGAM頁(page type 9)。SGAM頁用來跟蹤哪些區正作為混合區使用且至少有一個可用頁。每個區對應一個GAM頁的有一個位。如果這個位的值是1,對應區作為混合區使用且至少有個可用頁,如果這個位值是0,對應區沒作為混合區使用或所有頁作為混合區使用了。一個SGAM頁可以保存接近64000個區的信息。那就是說,一個SGAM頁可以保存64000 * 8 * 8 /1024 =4000MB。簡而言之,一個7GB大小的數據文件將有2個SGAM頁。SQL Server : 理解GAM與SGAM頁。
第5個、6個頁,(頁號4,5),在SQL Server架構里當前沒有被使用。頁類型是0。如果用DBCC PAGE命令查看這些頁只會輸出頁頭信息,並以非法頁類型結束。
第7個頁,頁號6,是第一個DCM頁(page type 16)。SQL Server使用DCM頁來跟蹤自上次完整備份后,修改過的區信息。每個區對應DCM頁里的一個位。如果這個位的值1,對應區自上一次完整備份后,已被修改。如果這個位值是0,對應區自上一次完整備份后,未作修改。一個DCM頁可以保存接近64000個區的信息。每511232個頁,DCM頁會重復一個。一個DCM頁可以跟蹤63904個區信息。第2個DCM頁出現在第511238頁。SQL Server: 理解DCM頁。
第8個頁,頁號7,是第一個BCM頁(page type 17)。SQL Server使用BCM頁來跟蹤自上次日志備份后,通過大容量日志操作被修改的區信息。每個區對應BCM頁里一個位。如果這個位的值是1,對應區自上一次日志備份后,因大容量日志操作后,這個區被修改。如果這個位的值是0,對應區自上一次日志備份后,因大容量日志操作后,這個區未被修改。一個BCM頁可以保存近64000個區的信息。每511232個頁,BCM頁會重復一個。一個BCM頁可以跟蹤63904個區信息。第2個BCM頁出現在第511239頁。SQL Server :理解BCM頁。
第9個頁,頁號8,是第一個IAM頁(page type 10)。IAM頁是用來跟蹤,指定表的分配單元的對應頁或區在GAM內的分區里的分配情況。SQL Server :理解IAM頁。
第10個頁,頁號9,是啟動頁(page type 13)。啟動頁只出現在主數據文件(prmary data file)里的第9頁,啟動頁不會出現在第2個數據文件里。我們可以使用DBCC PAGE命令查看它的頁信息,在這個頁里保存的頁信息值是自說明的。如果這個頁因某些原因損壞的話,我們將不能使用命令DBCC CheckDb來修復。頁還原也不能改變這個情況。只能從上一次好的數據庫備份中恢復才可以修復這個問題。
從第11頁開始,你可以看到各種不同的頁混合在一起,像數據頁,索引頁,IAM頁,行溢出頁和LOB頁等等。數據頁的頁類型是1,索引頁的頁類型是2,行溢出(Row-overflow)頁和LOB頁的頁類型是3。數據頁和索引頁是以同樣結構保存的。SQL Server:理解數據頁結構。
行溢出(Row-overflow)頁用來存儲不能在一頁里保存的數據。LOB頁用來保存大型對象,並不作為行數據的一部分來保存。
參考文章:
http://www.sqlservercentral.com/blogs/practicalsqldba/2013/09/02/sql-server-data-file-structure/