zoukankan      html  css  js  c++  java
  • SQL IAM的理解

          一个 IAM 页在文件中的范围为 4 GB(IAM跟踪分配单元使用的数据库文件的 4 GB 部分中的区,它记录的是一个文件中的4GB部分,即跟踪一个GAM间隔的分配到一个分配单元的分区。一个IAM页(索引分配页)跟踪单个文件里将近4GB的空间,以4GB为界。这4GB的数据称为“GAM间隔”。一个IAM页跟踪属于单个实体的特定GAM间隔内的扩展盘区),与 GAM 或 SGAM 页的范围相同。如果分配单元包含来自多个文件的区(一个分配单元是有分区组成的,这些分区它来自哪里,可能来自不同文件的区一起组成的这个分配单元),或者超过一个文件的 4 GB 范围,那么一个 IAM 链中将链接多个 IAM 页(一个IAM管理4G,超过了就只有用链表来连接多个IAM来管理更大的)。因此,每个分配单元在有区的每个文件中至少有一个 IAM 页(一个IAM只能跟踪一个文件中的一个分配单元,如果在一个文件中)。如果分配给分配单元的文件中的区的范围超过了一个 IAM 页能够记录的范围,一个文件中也可能会有多个 IAM 页。

    IAM 页根据需要分配给每个分配单元,在文件中的位置也是随机的。系统视图 (sys.system_internals_allocation_units) 指向分配单元的第一个 IAM 页。该分配单元的所有 IAM 页都链接到一个链中。

       

          IAM 页有一个标头,指明 IAM 页所映射的区范围的起始区。IAM 页中还有一个大位图,其中每个位代表一个区。位图中的第一个位代表范围内的第一个区,第二个位代表第二个区,依此类推。如果某个位是 0,它所代表的区将不会分配给拥有该 IAM 页的分配单元。如果这个位是 1,它所代表的区将被分配给拥有该 IAM 页的分配单元(一个IAM关联一个分配单元,知道这个IAM属于谁就找到了这个分区属于谁)。

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

    只有当数据库引擎无法在现有区内快速找到具有足够空间容纳要插入的行的页时,才会为分配单元分配一个新区。数据库引擎 使用比例分配算法从文件组的可用区中分配区。如果文件组内有两个文件,而一个文件的可用空间是另一个文件的两倍,那么每从后一个文件分配一页,就从前一个文件分配两页。这意味着文件组内的每个文件应该有近似的空间使用百分比。

  • 相关阅读:
    [07] Redis 持久化
    [06] Redis 事务
    [05] Jedis
    [04] Redis 配置文件
    [03] Redis 数据类型
    [02] Redis 简介&安装
    [01] NoSQL 简介
    06-NULL&typedef
    05-动态内存分配
    朴素贝叶斯分类器Naive Bayes
  • 原文地址:https://www.cnblogs.com/qianyz/p/1846747.html
Copyright © 2011-2022 走看看