我們已經(jīng)討論了GAM與SGAM頁,數(shù)據(jù)頁(Data Page) ,現(xiàn)在我們來看下頁面自由空間頁(Page Free Space (PFS))。
PFS在數(shù)據(jù)文件里是第2頁(頁號1,頁號從0開始),接在文件頭(file header,頁號0)后。GAM與SGAM是用來跟蹤區(qū)分配情況,而PFS頁是用來跟蹤頁分配級別(page level allocation)。當(dāng)分配頁時,數(shù)據(jù)庫引擎使用GAM與SGAM來確定有可用頁的區(qū)。一旦數(shù)據(jù)庫引擎找到有可用頁的區(qū),它使用PFS頁來確定在那個區(qū)里未分配的頁,頁里可用空間量是多少。可用空間只對頁存儲LOB值(例如text/image, varchar(max), nvarchar(max), varbinary(max), row overflow data)或堆數(shù)據(jù)頁時跟蹤。默認(rèn)情況下,LOB數(shù)據(jù)保存在獨(dú)立的頁,只通過在數(shù)據(jù)頁保留一個指向獨(dú)立頁的指針。在有可用空閑的頁里數(shù)據(jù)才可以被保存。對于索引頁來說,數(shù)據(jù)應(yīng)該和索引順序一樣保存,所以沒有插入記錄指針的說法。也就沒有必要在索引里跟蹤可用空間。
GAM和SGAM都有位圖,但是PFS頁只有字節(jié)圖。在PFS頁區(qū)間它為每頁保留1位。一個PFS頁可以保存8088頁的可用空間使用信息。
在每字節(jié)的每一位代表信息如下:
我們來看一個具體的例子:新建一個數(shù)據(jù)庫,并使用DBCC PAGE命令查看PFS頁的信息:
1 CREATE DATABASE PFSdb2 GO3 USE PFSdb4 GO5 DBCC TRACEON(3604)6 GO7 DBCC PAGE(PFSdb,1,1,3)
........
可以看到,自180頁到287頁空間沒分配了。
我們往表里插入點(diǎn)數(shù)據(jù),再用DBCC PAGE查看下PFS頁的信息:
1 SELECT * INTO SalesOrderHeaderTest FROM AdventureWorks2008R2.Sales.SalesOrderHeader2 DBCC TRACEON(3604)3 GO4 DBCC PAGE(PFSdb,1,1,3)
......
可以看到從288頁到1311頁有新頁添加。
我們現(xiàn)在把表drop掉,再看看PFS頁的信息:
......
可以看到剛才被分配的頁現(xiàn)在變成未分配了,但是空間還是100%被占用。這是因?yàn)樵陧摏]有被重新分配前,PFS字節(jié)沒有被完全重設(shè)。在重新分配時,數(shù)據(jù)庫引擎只重設(shè)分配狀態(tài)位,這可以讓數(shù)據(jù)庫引擎在回滾重新分配時,通過重設(shè)分配狀態(tài)位即可。
新聞熱點(diǎn)
疑難解答
圖片精選