SQL Server :理解Page Free Space (PFS) 页 02
2015-11-23 09:28
302 查看
页面自由空间页(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页的信息:
........
可以看到,自180页到287页空间没分配了。
我们往表里插入点数据,再用DBCC PAGE查看下PFS页的信息:
......
可以看到从288页到1311页有新页添加。
我们现在把表drop掉,再看看PFS页的信息:
......
可以看到刚才被分配的页现在变成未分配了,但是空间还是100%被占用。这是因为在页没有被重新分配前,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 :理解GAM和SGAM页 01
- 几款开源的图形化Redis客户端管理软件推荐
- MySQL Proxy 实现 MySQL 读写分离提高并发负载
- mysql存储过程实例
- SQL Server 中 Index Allocation Map(IAM)介绍 02
- 利用DBCC PAGE查看SQL Server中的表和索引数据
- SQLSERVER DBCC命令大全
- 数据库分表使用思考
- Oracle清空或者删除当前用户下所有的表
- MySQL 字符集学习笔记
- Day 9:(15)备份与恢复--参考答案
- Day 9:(14) 触发器实训_参考答案
- Day 9:(13) 存储过程实训_参考答案
- mysql使用笔记(四)
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- SQLServer中merge函数用法详解
- MySQL中InnoDB存储引擎的锁的基本使用教程
- Oracle数据库按时间进行分组统计数据的方法
- Day 9:(12)用户定义函数实训参考答案
- MySQL中的事务日志