SQL Server IAM 页面
大家好,欢迎来到 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 页。
每个分配单元以链形式链接的 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_page_file_id为[FileID],allocated_page_page_id为[PageID],page_type_desc,extent_page_id/8为ExtentID,
is_mixed_page_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 排序
第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 来向您展示信息是如何记录的。
前 8 页列在“单页分配”下,这意味着它们处于混合范围。
(1:352)~(1:360) 范围一致,结果与 DMF sys.dm_db_database_page_allocations 匹配
(1:352) 是范围 44 的第一页
(1:360) 是范围 45 的第一页
让我们深入了解参数 1 的 IAM 页面:
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)中。
1)'0000381f'是保留的,我们不需要担心。
2)我关心的字符串是'00000000 0030'
下表解释了该字符串。
3)表中的每一位代表一个盘区。
4)0 表示该区未被 IAM 的该表占用/分配。
5)1表示该extent被IAM的这张表占用/分配,并且是统一的extent。
6)这里有更多细节
这与我们之前使用参数 3 从 DBCC Page 得到的结果完全相同。
您可以下载dbtest20200904.zip并尝试一下。
微信赞赏
支付宝赞赏