PFS(Page Free Space),也叫页面自由空间,该页面用来跟踪一个文件中每一个特定的页面的利用率情况。一个文件中第二个页面(页码1)就是PFS页面,该页面的每个字节都记录了相应页面的分配情况、页面类型、是否IAM页、是否包含删除记录、以及空间利用率信息;PFS能够管理和跟踪8088个页面的使用情况,即接近64M的空间,以后每8088个页面将再出现一次。
让我们首先了解一下PFS的页面管理字节的构造,管理单位为字节,每字节管理一个页面。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
页面是否分配 | 是否混合页面 | 是否IAM页面 | 是否幻影页面 | 空间利用率 |
第0个bit为保留字节,始终为0
第1个bit表示该页面是否已分配,我们知道GAM页用来管理区是否已分配,但一个区包含8个页面,所以用该bit用来准确定位该区的某个页面是否已分配出去了。
第2个bit表示该页面是否混合分区的一个页面。
第3个bit表示该页面是否是一个IAM页面。
第4个bit表示该页面中是否包含幻影或已删除记录,这有助于SQL Server定期清理幻影或已删除记录。
第5~7个页面表示该页面的空间使用率情况。
• 0:表示该页面为空
• 1:表示该页面已使用1~50%
• 2:表示该页面已使用51~80%
• 3:表示该页面已使用81~95%
• 4:表示该页面已使用96~100%
我们可以用dbcc page(testdb,1,1,2)来看一下PFS的页面结构,BUFFER和PAGE HEADER再次就不做详述了,PFS关于页面分配的信息是从第100个字节开始的,最后四个字节为系统保留字节,总计管理8088页。
其中头四页均为44,换算成2进制即0100 0100,即为未分配(大概为保留页的缘故),且为已分配完成的混合区或统一类型区,非IAM页,且无幻影记录,空间利用率96~100%。
#div_code img { border: 0px none; }
4F09C060: 00009c1f 44444444 00004444 60647060 †....DDDD..DD`dp`
4F09C070: 74706070 60606060 60707060 40404040 †tp`p`````pp`@@@@
4F09C080: 40404040 61706070 60606070 60306060 †@@@@ap`p```p` 0 ``
4F09C090: 60217024 60706060 60606060 40203020 †`!p$`p``````@ 0
4F09C0A0: 20202820 60606060 60606070 60606060 † ( ```````p````
4F09C0B0: 70203020 30706070 70607060 70203060 †p 0 0p`pp`p`p 0 `
4F09C0C0: 70203068 70607060 70607060 70607060 †p 0hp`p`p`p`p`p`
4F09C0D0: 70203060 60602020 60702030 20306070 †p 0 ``` `p 0 0 `p
4F09C0E0: 60702830 60707070 60606070 60706070 †`p( 0 `ppp```p`p`p
4F09C0F0: 60706070 40404020 20202020 60706070 †`p`p@@@ `p`p
4F09C100: 60706060 64616070 60706070 60706070 †`p``da`p`p`p`p`p
4F09C110: 60700000 00000000 00000000 00000000 †`p..............
4F09C120: 00000000 00000000 00000000 00000000 †................
4F09DFF0: 00000000 00000000 00000000 00006000 †..............`.
最后让我们用Internals Viewer插件看一下PFS页的全貌吧。
第七个页面(页码6)被称为差异变更(Differential Changed Map,DCM)页面。它跟踪一个文件中的哪一个区在最新一次完全数据库备份以后被修改过。SQL Server用在增量备份时只对已发生数据变更的分区进行增量备份即可。
第八个页面(页码7)被称为批量更改映射(Bulk Changed Map,BCM)页面,该页面当文件中的一个区在最小量或批量记日志操作中被使用时用到。就像GAM和SGAM页面,DCM和BCM页面针对它们代表的文件区间中每一个区都有一个比特位相对应。这些页面的常规间距为511 230个页面。
此外关于数据库在进行DML操作如何寻找合适的分区和页面对数据进行处理还是留待后续介绍吧。