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


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

    以上为摘抄

  • 相关阅读:
    PS的使用[未完待续]
    Navicat破解方法【很靠谱】
    some blogs
    Linux curl命令详解
    api_automation_mysql
    linux 笔记
    pytest 笔记
    sel+python 基础
    postman 断言
    homebrew note
  • 原文地址:https://www.cnblogs.com/qianyz/p/1846099.html
Copyright © 2020-2023  润新知