標籤:
原文:SQL Server :理解Page Free Space (PFS) 頁
我們已經討論了GAM與SGAM頁,資料頁(Data Page) ,現在我們來看下頁面自由空間頁(Page Free Space (PFS) )。
PFS在資料檔案裡是第2頁(頁號1,頁號從0開始),接在檔案頭(file header,頁號0)後。GAM與SGAM是用來跟蹤區分配情況,而PFS頁是用來跟蹤頁分配層級(page level allocation)。當分配頁時,資料庫引擎使用GAM與SGAM來確定有可用頁的區。一旦資料庫引擎找到有可用頁的區,它使用PFS頁來確定在那個區裡未分配的頁,頁裡可用空間量是多少。可用空間只對頁儲存LOB值(例如text/image, varchar(max), nvarchar(max), varbinary(max), row overflow data)或堆資料頁時跟蹤。預設情況下,LOB資料儲存在獨立的頁,只通過在資料頁保留一個指向獨立頁的指標。在有可用閒置頁裡資料才可以被儲存。對於索引頁來說,資料應該和索引順序一樣儲存,所以沒有插入記錄指標的說法。也就沒有必要在索引裡跟蹤可用空間。
GAM和SGAM都有位元影像,但是PFS頁只有位元組圖。在PFS頁區間它為每頁保留1位。一個PFS頁可以儲存8088頁的可用空間使用資訊。
在每位元組的每一位代表資訊如下:
- 第0-2位:在頁裡有多少可用空間
- 0x00:空的,未使用
- 0x01:1%-50%被佔用
- 0x02:51%-80%被佔用
- 0x03:81%-95%被佔用
- 0x04:96%-100%被佔用
- 第3位(0x08):頁裡是否有1條或多條鬼影記錄(ghost records)
- 第4位(0x10):當前頁是IAM頁嗎?
- 第5位(0x20):當前頁是混合頁嗎?
- 第6位(0x40):當前頁是已指派嗎?
- 第7位:未使用
我們來看一個具體的例子:建立一個資料庫,並使用DBCC PAGE命令查看PFS頁的資訊:
1 CREATE DATABASE PFSdb2 GO3 USE PFSdb4 GO5 DBCC TRACEON(3604)6 GO7 DBCC PAGE(PFSdb,1,1,3)
........
可以看到,自180頁到287頁空間沒分配了。
我們往表裡插入點資料,再用DBCC PAGE查看下PFS頁的資訊:
1 SELECT * INTO SalesOrderHeaderTest FROM AdventureWorks2008R2.Sales.SalesOrderHeader2 DBCC TRACEON(3604)3 GO4 DBCC PAGE(PFSdb,1,1,3)
......
可以看到從288頁到1311頁有新頁添加。
我們現在把表drop掉,再看看PFS頁的資訊:
......
可以看到剛才被分配的頁現在變成未分配了,但是空間還是100%被佔用。這是因為在頁沒有被重新分配前,PFS位元組沒有被完全重設。在重新分配時,資料庫引擎只重設分配狀態位,這可以讓資料庫引擎在復原重新分配時,通過重設分配狀態位即可。
SQL Server :理解Page Free Space (PFS) 頁