MSSQL优化教程之1.4 其他几种类型的页面

上一次只是讲了讲普通数据页面,后来自己回想一下,应该跟大家讲讲其他类型的页面,作为一个知识体系贯穿起来。 
 

全局分配映射表 (GAM)
GAM 页记录已分配的区。每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据(每个区占用一位,每八个区占用一个字节,每个页大概可用字节为8000个字节,所以能管理4GB的数据)。GAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区可用;如果位为 0,则区已分配。

共享全局分配映射表 (SGAM)
SGAM 页记录当前用作混合区且至少有一个未使用的页的区。每个 SGAM 包含 64,000 个区,相当于近 4 GB 的数据。SGAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区正用作混合区且有可用页。如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。

 

区的当前使用情况

GAM 位设置

SGAM 位设置

可用,未使用

1

0

统一区或已满的混合区

0

0

具有可用页的混合区

0

1

这样,数据库在分配对象的时候,先去找混合区,那还有未使用的混合区就是到GAM页和SGAM页里对应的0或者1.

 

PFS

Free space page,他用来跟踪页面的使用者状态,到底是满的还是空的,还是只是使用了百分之几十。每个页面都有一个对应的字节来描述,所以,每个pfs页面只能管理约8000个页面。数据库引擎将使用 PFS 页来记录区中的哪些页已分配或哪些页可用。数据库引擎必须分配新页时,将使用此信息。保留的页中的可用空间量仅用于堆和 Text/Image 页。数据库引擎必须找到一个具有可用空间的页来保存新插入的行时,使用此信息。索引不要求跟踪页的可用空间,因为插入新行的点是由索引键值设置的。

 

IAM

Index Allocation Map,这个页面记录哪个区被分配到了那个对象了,总共可以标记4GB的区,同时,这个页面是非常重要的一个页面,在数据插入的时候,起到至关重要的作用。

记得很久以前看过一篇大牛的文章,说堆表插入比聚集索引树快,但是最近看了一篇文章,在一个模拟的多并发情况下,事实却相反,而他的推断依据,也是因为数据库的分配体制而来的,也就是IAM+PFS数据分配体制。

数据库在新插入数据的时候(堆表),先去IAM页面上查找这个对象的区,然后找到区后在PFS页面上找到这个区的使用情况,如果有空的,那么就插入到这个区。其中涉及到两个操作:查找IAM,查找PFS,但是IAMPFS是有锁存在的,在大量并发情况下,肯定会存在在区分配满后,会将PFS页面更新,更新其状态,比如置为已满或者已空,这样,就会涉及到并发冲突问题。而且堆表上绝大部分的查找操作都是表扫描,而表扫描一次性都要占用IAMPFS页,这样并发问题更加突出。所以那篇文章的作者模拟出一环境,不停查找和不停的插入,对比堆表和聚集索引表的插入速度,实际上聚集索引是要快很多的,具体快多少,忘记倍数了,^_^.

 

DCM

这个页面全称叫:different change map ,他记录自从上次全备以来的数据改变的页面,以备差异备份,如果不执行差异备份,这个功能是不是可以略去,还请大人们指点一下。

 

BCM

Bulk change map 批量插入的时候防止日志大量记录而使用的一个页面,跟踪被新插入的页面,在大容量插入模式下,这个页面非常管用。

Sort page:

排序时所用到的临时页,排序中间操作存储数据用的。

 

另外这些页面都是位于数据库文件的第123前几个页面(具体他们之间也有顺序,我就不罗嗦了,对优化没有啥关系),可以称为是数据库的元文件。他们这些页面都是常驻于缓冲池内的,不用担心他们会造成物理读取。

 

另外长叹一声,我的兄弟因伤退赛,唉,太可惜了……………………………

posted on 2008-08-18 16:32  Keep Walking  阅读(14095)  评论(9编辑  收藏  举报