標籤:
這段時間談了很多頁,現在我們可以看下這些頁在資料檔案裡是如何組織的。
我們都已經知道,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來修複。頁還原也不能改變這個情況。只能從上一次好的Database Backup中恢複才可以修複這個問題。
從第11頁開始,你可以看到各種不同的頁混合在一起,像資料頁,索引頁,IAM頁,行溢出頁和LOB頁等等。資料頁的頁類型是1,索引頁的頁類型是2,行溢出(Row-overflow)頁和LOB頁的頁類型是3。資料頁和索引頁是以同樣結構儲存的。SQL Server:理解資料頁結構。
行溢出(Row-overflow)頁用來儲存不能在一頁裡儲存的資料。LOB頁用來儲存大型物件,並不作為行資料的一部分來儲存。
SQL Server :理解資料檔案結構