原文: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页的信息:

 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字节没有被完全重设。在重新分配时,数据库引擎只重设分配状态位,这可以让数据库引擎在回滚重新分配时,通过重设分配状态位即可。

SQL Server :理解Page Free Space (PFS) 页的更多相关文章

  1. SQL Server 存储(4/8):理解Page Free Space (PFS) 页

    我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...

  2. SQL Server :理解GAM和SGAM页

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

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

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

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

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

  5. SQL Server :理解DCM页

    原文:SQL Server :理解DCM页 我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map ...

  6. SQL Server :理解数据页结构

    原文:SQL Server :理解数据页结构 我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或 ...

  7. SQL Server存储(6/8) :理解DCM页

    我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map:DCM ),还有差异备份(differen ...

  8. SQL Server页类型汇总+疑问

    该文章整理自:http://www.sqlnotes.info/2011/10/31/page-type/ SQL Server中包含多种不同类型的页,来满足数据存储的需求.不管是什么类型的页,它们的 ...

  9. SQL SERVER大话存储结构(1)_数据页类型及页面指令分析

                如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!          SQLServer的数据页大 ...

随机推荐

  1. form表单多值提交

    $.ajax({ cache: true, type: "POST", url:ajaxCallUrl, data:$('#yourformid').serialize(),// ...

  2. 14.2.5.6 Adaptive Hash Indexes 自适应Hash Indexes

    14.2.5.6 Adaptive Hash Indexes 自适应Hash Indexes adaptive hash index(AHI) 让InnoDB 执行更加像在一个内存数据库里在, 在不牺 ...

  3. HDU 4296 Buildings (YY)

    题意: 给定N个物体,每个物体有两个参数w,s.   w代表它自身的重量: s代表它的强度.现在要把这些物体叠在一起,会产生一个PDV值. PDV解释:(Σwj)-si, where (Σwj) st ...

  4. Cocos2d-x CCProgressTimer

    CCProgressTimer,创建使用这个节点可以大致实现两个作用的效果: 其一:在游戏中几乎大部分的游戏启动界面都是游戏加载画面,那么用到的一般是进度条提示加载进度,其使用的就是CCProgres ...

  5. Eclipse 修改maven 仓储Repository位置

    简述: 使用两个Nexus, 需要配置两份不同的Maven仓库 步骤: 1. 下载新的Maven运行包 2. 进入conf/ 修改setting.xml项 <localRepository> ...

  6. iOS中的字符串NSString

    创建一个字符串对象: NSstring * str1 = @"hello world"; NSString * str = [[NSString alloc]initWithStr ...

  7. 智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战

    http://www.csdn.net/article/2014-06-04/2820063-TCL-Smart-TV-Innovation-Competation

  8. [置顶] android系统功能调用大全

    1.从google搜索内容  Intent intent = new Intent();  intent.setAction(Intent.ACTION_WEB_SEARCH);  intent.pu ...

  9. C# 计算字符串/文件的哈希值(MD5、SHA)

    原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...

  10. HDOJ 2736 Surprising Strings

    Surprising Strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...