SQL Server IAM 页面

发布时间 2023-07-26 10:19:55作者: 雪竹子

大家好,欢迎来到 SQL Server 分配系列

今天,我将向您展示 IAM 页面的详细信息。

索引 分配映射 (IAM) 页映射分配单元使用的数据库文件的 4 GB 部分中的范围。分配单元是以下三种类型之一:

  • IN_ROW_DATA
    保存堆或索引的分区。
  • LOB_DATA
    保存大对象 (LOB) 数据类型,例如 XML、VARBINARY(max) 和 VARCHAR(max)。
  • ROW_OVERFLOW_DATA
    保存存储在 VARCHAR、NVARCHAR、VARBINARY 或 SQL_VARIANT 列中超过 8,060 字节行大小限制的可变长度数据。

堆或索引的每个分区至少包含一个 IN_ROW_DATA 分配单元。它还可能包含 LOB_DATA 或 ROW_OVERFLOW_DATA 分配单元,具体取决于堆或索引架构。

IAM 页面覆盖文件中的 4 GB 范围,与 GAM 或 SGAM 页面的覆盖范围相同。如果分配单元包含来自多个文件的盘区,或者一个文件的多个 4 GB 范围,则 IAM 链中将链接多个 IAM 页。因此,每个分配单元对于其上具有盘区的每个文件至少有一个 IAM 页。如果分配给分配单元的文件上的范围超出单个 IAM 页可以记录的范围,则文件上也可能存在多个 IAM 页。

标题为 SQL Server IAM 页面的博客文章的缩略图 1

 

标题为 SQL Server IAM 页面的博客文章的缩略图 2

 

每个分配单元以链形式链接的 IAM 页面 IAM 页具有一个标头,该标头指示 IAM 页映射的范围范围的起始范围。IAM 页还有一个大位图,其中每一位代表一个范围。映射中的第一位表示范围中的第一个范围,第二位表示第二个范围,依此类推。如果某个位为 0,则它所代表的盘区不会分配给拥有 IAM 的分配单元。如果该位为 1,则其表示的范围将分配给拥有 IAM 页的分配单元。

当 SQL Server 数据库引擎必须插入新行且当前页中没有可用空间时,它会使用 IAM 和 PFS 页来查找要分配的页,或者对于堆或文本/图像页,查找要分配的页有足够的空间容纳该行。SQL Server 数据库引擎使用 IAM 页来查找分配给分配单元的区。对于每个盘区,SQL Server 数据库引擎都会搜索 PFS 页以查看是否有可以使用的页。每个 IAM 和 PFS 页都包含大量数据页,因此数据库中的 IAM 和 PFS 页很少。这意味着IAM和PFS页面一般都在SQL Server缓冲池的内存中,因此可以快速搜索到它们。对于索引来说,新行的插入点是由索引键设置的,但是当需要新页时,就会发生前面描述的过程。

 

 

帖子 1中,我创建了一个包含 8 页的表,所有这 8 页都是混合范围。我将在表中插入更多行以增加页数。正如您所期望的,这些新行/页将被分配到统一的范围。

我将向您介绍 SQL Server 如何在 IAM 页面中保存信息。

数据操作:

T-SQL:

插入 heaptable1 值(15,REPLICATE('o',8000)) --第 9 页

插入 heaptable1 值(16,REPLICATE('p',8000)) --第 10 页

插入 heaptable1 值(17,REPLICATE('q',8000)) --第 11 页

插入 heaptable1 值(18,REPLICATE('r',8000)) --第 12 页

插入 heaptable1 值(19,REPLICATE('s',8000)) --第 13 页

插入 heaptable1 值(20,REPLICATE('t',8000)) --第 14 页

插入 heaptable1 值(21,REPLICATE('u',8000)) --第 15 页

插入 heaptable1 值(22,REPLICATE('v',8000)) --第 16 页

插入 heaptable1 值(23,REPLICATE('w',8000)) --第 17 页

 

表 heaptable1 有 17 个页,分为四个扩展区、两个混合扩展区和两个统一扩展区。

选择allocated_pa​​ge_file_id为[FileID],allocated_pa​​ge_page_id为[PageID],page_type_desc,extent_page_id/8为ExtentID,

is_mixed_pa​​ge_allocation,extent_page_id 为 [范围中的第一页],extent_page_id+7 为 [范围中的最后一页],is_allocated From 

sys.dm_db_database_page_allocations(db_id(),object_id('dbo.heaptable1'),null,null,'detailed') 按 allocate_page_page_id 排序

标题为 SQL Server IAM 页面的博客文章的缩略图 3

 

第246页是IAM页面。

第245,247,328,329,330,331,332和333页的程度混合。

从页(1:352)开始,所有页都以统一的范围分配。

页(1:352)~(1:359) 位于范围 44 中,

页(1:360)~(1:367) 位于范围 45 中。

 

让我运行 IAM 页面的 DBCC PAGE 来向您展示信息是如何记录的。

标题为 SQL Server IAM 页面的博客文章的缩略图 4

 

前 8 页列在“单页分配”下,这意味着它们处于混合范围。

(1:352)~(1:360) 范围一致,结果与 DMF sys.dm_db_database_page_allocations 匹配

(1:352) 是范围 44 的第一页

(1:360) 是范围 45 的第一页

 

让我们深入了解参数 1 的 IAM 页面:

标题为 SQL Server IAM 页面的博客文章的缩略图 5

 

 

1.IAM页面有两个槽位,

  • 第一个插槽(插槽 0)用于混合范围中的页面。
  • 第二个槽(槽 1)用于统一范围内的页面。

2.让我解释一下插槽0。

1)矩形中的每个字符串代表一页,格式为PageId:FileId。

2)前8个字符是页面id,后四部分是Fileid。

这是解释表:

原始字符串->

PId:文件ID->

FId:PID->

FId:PID->

FId:PID(十进制)

f50000000100

f5000000:0100

0100:f5000000

0001:000000f5

1:245

f70000000100

f7000000:0100

0100:f7000000

0001:000000f7

1:247

480100000100

48010000:0100

0100:48010000

0001:00000148

1:328

490100000100

49010000:0100

0100:49010000

0001:00000149

1:329

4a0100000100

4a010000:0100

0100:4a010000

0001:0000014a

1:330

4b0100000100

4b010000:0100

0100:4b010000

0001:0000014b

1:331

4c0100000100

4c010000:0100

0100:4c010000

0001:0000014c

1:332

4d0100000100

4d010000:0100

0100:4d010000

0001:0000014d

1:333

3.我已经演示了 IAM 页面如何以混合范围存储前 8 个页面,现在让我们继续讨论统一范围。

 

4.统一范围信息存储在第二个槽(槽1)中。

标题为 SQL Server IAM 页面的博客文章的缩略图 6

 

 

1)'0000381f'是保留的,我们不需要担心。

2)我关心的字符串是'00000000 0030'

下表解释了该字符串。

标题为 SQL Server IAM 页面的博客文章的缩略图 7

 

3)表中的每一位代表一个盘区。

4)0 表示该区未被 IAM 的该表占用/分配。

5)1表示该extent被IAM的这张表占用/分配,并且是统一的extent。

6)这里有更多细节

标题为 SQL Server IAM 页面的博客文章的缩略图 8

 

这与我们之前使用参数 3 从 DBCC Page 得到的结果完全相同。

标题为 SQL Server IAM 页面的博客文章的缩略图 9

 

 

您可以下载dbtest20200904.zip并尝试一下。