我们已经讨论了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页的信息:

 CREATE DATABASE PFSdb
GO
USE PFSdb
GO
DBCC TRACEON(3604)
GO
DBCC PAGE(PFSdb,1,1,3)

........

可以看到,自180页到287页空间没分配了。

我们往表里插入点数据,再用DBCC PAGE查看下PFS页的信息:

 SELECT * INTO SalesOrderHeaderTest FROM AdventureWorks2008R2.Sales.SalesOrderHeader
DBCC TRACEON(3604)
GO
DBCC PAGE(PFSdb,1,1,3)

......

可以看到从288页到1311页有新页添加。

我们现在把表drop掉,再看看PFS页的信息:

......

可以看到刚才被分配的页现在变成未分配了,但是空间还是100%被占用。这是因为在页没有被重新分配前,PFS字节没有被完全重设。在重新分配时,数据库引擎只重设分配状态位,这可以让数据库引擎在回滚重新分配时,通过重设分配状态位即可。

参考文章:

http://www.sqlservercentral.com/blogs/practicalsqldba/2012/10/10/sql-serverunderstanding-the-page-free-space-pfs-page/

SQL Server 存储(4/8):理解Page Free Space (PFS) 页的更多相关文章

  1. SQL Server :理解Page Free Space (PFS) 页

    原文:SQL Server :理解Page Free Space (PFS) 页 我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free S ...

  2. SQL Server 存储(3/8):理解GAM和SGAM页

    我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...

  3. SQL SERVER存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  4. SQL Server存储ntext截断问题

    SQL Server存储ntext截断问题   最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...

  5. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  6. SQL Server 存储(2/8):理解数据记录结构

    在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...

  7. SQL Server 存储(8/8):理解数据文件结构

    这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的. 我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位.SQL Server把数据文件里的第1页标记为 ...

  8. SQL Server 存储(5/8):理解IAM 页

    在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...

  9. SQL Server存储(7/8) :理解BCM页

    今天我们来讨论下批量更改映射(Bulk Changed Map:BCM)页,还有大容量日志恢复模式( bulk logged recovery model )如何运作的. 批量更改映射(Bulk Ch ...

随机推荐

  1. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  2. 【异常】VS中运行HTTP 无法注册URL

    参考资料 http://www.java123.net/detail/view-449670.html http://www.cnblogs.com/jiewei915/archive/2010/06 ...

  3. 避开WebForm天坑,拥抱ASP.Net MVC吧

    有鹏友在如鹏网的QQ群中提了一个问题: 请问,在ASP.Net中如何隐藏一个MenuItem,我想根据不同的权限,对功能菜单进行隐藏,用style不行. 如果要仅仅解答这个问题,很好解答,答案很简单: ...

  4. 由ASP.NET所谓前台调用后台、后台调用前台想到HTTP——实践篇(二)

    在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP——理论篇中描述了一下ASP.NET新手的三个问题及相关的HTTP协议内容,在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP—— ...

  5. WPF路线图白皮书: 2015及未来

    介绍 当2006年微软首次推出Windows Presentation Foundation(WPF)时,它代表了应用程序的设计和开发又向前跨出了巨大的一步.它简化了GUI应用程序的开发,有助于UI和 ...

  6. 将网站添加到iPhone的主屏幕上

    我之前有篇文章介绍过如何将网站固定到Windows的开始菜单,并可以自定义图标.颜色以及Windows推送通知,其实Apple也有类似的功能,通过在网页的head部分添加link标记,在Safari浏 ...

  7. Redis总结笔记(一):安装和常用命令

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/112.html?1455860824 一.redis简单介绍 redis是 ...

  8. 【SVN多用户开发】代码冲突&解决办法

    SVN是一款集中式的代码存储工具,可以帮助多个用户协同开发同一应用程序. 但是SVN不能完全代替人工操作,有时也需要程序员自己进行沟通确认有效的代码. 下面就简单的看一下,常见的代码冲突以及解决方法. ...

  9. WinMTR

    一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由. 在Linux中有一个好用的网络连通性判断工具,它可以结合ping n ...

  10. iOS----关于第三方的运用(有待补充)

    第三方东西涵盖哪些内容? 1)第三方SDK 2)第三方框架 3)第三方功能代码的封装开源分享 4)第三方工具类等等 PS:1. 对于一个在正在深入学习的程序员而言,有时候参考学习或者使用一下第三方的东 ...