GAM、SGAM、PAM、IAM、DCM 、BCM

 

 SQL SERVER 中有两种类型的区:混合区和统一区
 
 混合区
分配给任意一条 IAM 链( SQL SERVER 2000 中的一个索引或者是 2005 中的分配单元)的前 8 个页的分配单位是单个页,这种页被称为混合页。就是说每次分配的是一个单独的页而不是一个区。这样便允许非常小的表花费最小数量的空间。一旦一条 IAM 链跨过了前 8 页的门槛,以后便分配统一区,再也不会分配混合页了。
从混合区中分配来的混合页,不需要分配给特定的 IAM 链。因为这些区会被全局分配跟踪(通过 GAM 页),所以不会分配给一个 IAM 链的。混合区中若还有没分配的页,该区同时会被 SGAM 页跟踪。当需要分配一个混合页,系统就会检查 SGAM 页是否还有这样的区。如果没有的话,就会分配一个新的混合区,并从中分配一页,然后这个区就被 SGAM 页跟踪直到所有的页被分配。
因为混合区不会被分配给一个特定的 IAM 链,这就是说它可能分配给 8 个不同的 IAM 链。不管有多少页被分配给 IAM 链, IAM 页本身总是混合页。这就是说一个混合区可有多种页类型,包括 IAM 页、数据页、索引页或文本页。

 
统一区
一旦跨过了 8 页的门槛,以后就从统一区上分配给 IAM 链了。这就是说一次分配一个区给一条 IAM 链,并在 IAM 链上的 IAM 页上标明——不管是谁映射该区所在的 GAM 区间的。该区同时会被相关的的 GAM 页跟踪是否已分配,这样其它的 IAM 链就不会再分配它了。
一个统一区的所有页必须分给同一条 IAM 链。然后,它们不需要是同一类型的页。比如,一个聚集索引会同时有数据和索引页。当一个区被分配给 IAM 链时,该区中的页并不是一次全被分配掉的(除非是大型数据操作),这些页通常是按需分配,每页的分配情况有 PFS 页跟踪。
当一个统一区的所有页都被释放,那么区本身就从拥有它的 IAM 链中释放了,并且可以再次分配给其他的 IAM 链,或者成为混合区

为备份跟踪变化的区
系统中有两个地方用来跟踪变化的区:
1.       自上次完整备份以来所有改变的区会有相关的差异位图页( differential bitmap page )跟踪。这样差异备份时便可以知道哪些区需要备份而不是备份整个数据库了。当下次完整备份时所有的差异位图页都被复位。
2.       自上次完整、差异或日志备份以来一个区在 BULK-LOGGED 恢复模式下发生了大日志操作,会有相关的最小日志位图页( minimally-logged bitmap page )跟踪。大日志操作后的任何日志备份就会包含所有这些跟踪的区。当下次备份时,所有的最小日志位图页都会被复位。

 

GAM、SGAM、PAM、IAM、DCM 和 BCM 都是 SQL Server 中用来管理空间分配的一些特殊分配映射表。

Sql Server 区的管理(GAM,SGAM)

全局分配映射表 (GAM) :
统一盘区,GAM 页记录已分配的区。每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据。GAM 用一个位来表示所涵盖区间内的每个区的状态。
如果位为 1,则区可用;如果位为 0,则区已分配。
GAM 位图中每位的含义如下:
1 )位为1 表示该区可用(你可以将它看作是当前分配给了GAM 页了).
2 )位为0 表示该区已经被分配使用了。

混合区和统一区,上面的含义一致。
注意一件事:在每个GAM 区间开始处是一个GAM 区,该区包含跟踪该GAM 区间的全局分配页,这个区不能当作正常的页被分配。第一个GAM 区开始于文件的第0 页,其页的布局如下:
•    页0 :文件头页(另文介绍)
•    页1 :第1 个PFS 页
•    页2 :第1 个GAM 页
•    页3 :第1 个SGAM 页
•    页4 :2005 及以后未用
•    页5 :2005 及以后未用
•    页6 :第1 个DIFF 映射页
•    页7 :第1 个ML 映射

共享全局分配映射表 (SGAM) :
由多个对象共同拥有该盘区,SGAM 页记录当前用作混合区且至少有一个未使用的页的区。每个 SGAM 包含 64,000 个区,相当于近 4 GB 的数据。
SGAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区正用作混合区且有可用页。如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。
SGAM 位图与GAM 位图的结构和覆盖区间完全一致,就是位表示的意思不同:
1 )位为1 表示区是混合区且有可用页。
2 )位为0 表示区未作混合区,或者虽然是混合区时但其所有页均在使用中。(本质上,同样的情况也说明SGAM 被用来寻找还没有进行页分配的混合区)。


Sql Server 可用空间的管理(PFS)

PFS(Page Free Space):也叫页面自由空间,该页面用来跟踪一个文件中每一个特定的页面的利用率情况,是以页为单位的。
一个文件中第二个页面(页码1)就是PFS页面,该页面的每个字节都记录了相应页面的分配情况、页面类型、是否IAM页、是否包含删除记录、
以及空间利用率信息;PFS能够管理和跟踪8088个页面的使用情况,即接近64M的空间,以后每8088个页面将再出现一次。

PFS 表示页可用空间。但是PFS 页跟踪的远不止这些。和GAM 区间相似,每个数据库文件同样也被分割成(概念上)PFS 区间。一个PFS 区间是8088 页或约64MB 。
PFS 页中不是位图,它是字节图,每个字节表示PFS 区间中的一页(不包括PFS 页本身)。PFS的页面管理字节的构造,管理单位为字节,每字节管理一个页面.
第0个bit为保留字节,始终为0

第1个bit表示该页面是否已分配,我们知道GAM页用来管理区是否已分配,但一个区包含8个页面,所以用该bit用来准确定位该区的某个页面是否已分配出去了。

第2个bit表示该页面是否混合分区的一个页面。

第3个bit表示该页面是否是一个IAM(索引分配映射)页面。

第4个bit表示该页面中是否包含幻影或已删除记录,这有助于SQL Server定期清理幻影或已删除记录。

第5~7个页面表示该页面的空间使用率情况。

也可以理解为:

字节中每位的含义如下:
1 )位0-2 :页中有多少可用空间
  a)0x00 表示空
  b)0x01 表示1~50% 满
  c)0x02 表示51~80% 满
  d)0x03 表示81~95% 满
  e)0x04 表示96~100% 满
2 )位3 (0x08 ):页中是否至少有一个ghost 记录?
3 )位4 (0x10 ):是否为IAM 页?
4 )位5 (0x20 ):是否为混合页?
5 )位6 (0x40 ):页是否已分配?(分配状态位)

比如一个IAM 页的PFS 字节为0x70 (已分配 + IAM 页 + 混合页)。你可以使用DBCC PAGE 来查看PFS 页。
跟踪可用空间只适用于存储LOB 值(比如SQL SERVER 2000 中的text/image 类型;SQL SERVER 2005 中再加上varchar(max)/varbinary(max)/XML 类型以及行溢出数据)和堆数据页。
因为只有这些页存储的数据不用排序, 所以可以在任何位置插入。而像索引是有明确的顺序的,所以插入点是没有选择的。

注意一点:重置PFS字节并不是很直观。PFS字节不会完全重置(译注:比如清0)而是要等到重新分配页时。当页释放时,只是改变了PFS字节中的分配状态位——这样可以很方便的回滚释放动作。

下面是一个例子。在数据库中表T1 只有一行数据。使用DBCC PAGE 检查IAM 页如下:
PFS (1:1) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL

如果我在一个显式事务中删除表,再执行DBCC PAGE ,结果如下:
PFS (1:1) = 0x30 IAM_PG MIXED_EXT 0_PCT_FULL

我们如果回滚事务,那么DBCC PAGE 的输出结果又变成:
PFS (1:1) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL


索引分配映射 (IAM)


"索引分配映射 (IAM)"页:将映射分配单元使用的数据库文件中 4 GB 部分中的区。主要用来标示 Sql Server 对象使用了哪些区。比如A表的非聚集索引B占用了 7895 4个区。这样,在再对此对象做更改的时候,能够快速的找到这4个区,更改文件。

当 SQL Server 数据库引擎必须在当前页中插入新行,而当前页中没有可用空间时,它将使用 IAM 和 PFS 页查找要将该行分配到的页,或者(对于堆或 Text/Image 页)查找具有足够空间容纳该行的页。数据库引擎使用 IAM 页查找分配给分配单元的区。对于每个区,数据库引擎将搜索 PFS 页,以查看是否有可用的页。每个 IAM 和 PFS 页覆盖大量数据页,因此一个数据库内只有很少的 IAM 和 PFS 页。这意味着 IAM 和 PFS 页通常位于内存中的 SQL Server 缓冲池中,所以能够很快找到它们。对于索引,新行的插入点由索引键设置。在这种情况下,不会出现上述搜索过程。

Sql Server 对已修改区得管理(DCM、BCM)

差异更改映射表 (DCM) :

这样便可以跟踪自上次执行 BACKUP DATABASE 语句后更改过的区。如果扩展盘区的位是 1,则自上次执行 BACKUP DATABASE 语句后扩展盘区已被修改。如果位是 0,则扩展盘区没有被修改。

差异备份只读取 DCM 页便可以确定已修改的区。这样大大减少了差异备份必须扫描的页数。运行差异备份所需的时间与自上次执行 BACKUP DATABASE 语句之后修改的区数成正比,而不是与整个数据库的大小成正比。


大容量更改映射表 (BCM) :

跟踪自上次执行 BACKUP LOG 语句后,被大容量日志记录操作修改的区。如果某个扩展盘区的位是 1,表明自上次执行 BACKUP LOG 语句后,该扩展盘区已经被有日志记录的大容量复制操作修改。如果位是 0,则该扩展盘区未被有日志记录的大容量复制操作修改。

尽管所有数据库中都显示 BCM 页,但只有在数据库使用大容量日志记录恢复模式时,才会与 BCM 页有关。在此恢复模式中,当执行 BACKUP LOG 时,备份进程将扫描 BCM 查找已经修改的区。然后,将那些区包括在日志备份中。如果数据库从数据库备份和一系列事务日志备份恢复,便可以恢复大容量日志记录操作。在使用简单恢复模式的数据库中,BCM 页是不相关的,因为大容量日志记录操作不记入日志。在使用完整恢复模式的数据库中,BCM 页同样不相关,因为该恢复模式将大容量日志记录操作视为有完整日志记录的操作。

DCM 页和 BCM 页的间隔与 GAM 和 SGAM 页的间隔相同,都是 64,000 个区。在物理文件中,DCM 和 BCM 页位于 GAM 和 SGAM 页之后。

ML 映射页
ML 代表最小日志(Minimally Logged )。这种页被用来在BULK_LOGGED 恢复模式中,跟踪自上次日志备份以来哪些区经过最小日志的修改操作。这样下次日志备份时除了正常备份日志,还要包括在位图中标明已修改的所有区。这种备份的区加上事务日志 就是自上次事务日志备份以来所发生的变化。一旦ML 页被读取,所有的位图都会被清除。如果你没有使用过BULK_LOGGED 恢复模式,那么ML 页是不会被使用的。
ML 位图与GAM 位图的结构和覆盖区间完全一致,就是位表示的意思不同:
1)  位为1 表示该区自上次日志备份来进过了最小日志操作的修改。
2)  位为0 表示该区未被修改。

 

DIFF 映射页
DIFF 表示差异(differential )。这种页被用来跟踪自上次完整备份以来哪些区被修改过。说DIFF 位图用来跟踪自上次差异备份以后的变化是一个常见的误解 。一个差异备份包含自上次完整备份以来的所有修改过的区。使用差异备份可以大大节省恢复时间——可以避免必须恢复自上次完整备份到最后一次差异备份期间的日志备份(以后专门介绍)。所有的位图直到下次完整备份才会被清除。注意:所有上面的解释我并没有说是完整的数据库 备份——因为完整或差异备份包括数据库、文件组和文件层次的备份。
DIFF 位图与GAM 位图的结构和覆盖区间完全一致,就是位表示的意思不同:
1 )位为1 表示该区自上次完整备份以来进行了修改。
2 )位为0 表示该区未被修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值