首页 > 数据库 >SQL Server IAM 页面

SQL Server IAM 页面

时间:2023-07-26 10:25:22浏览次数:58  
标签:IAM heaptable1 0100 Server SQL 范围 分配 页面

大家好,欢迎来到 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并尝试一下。

    dbtest20200904.zip    

标签:IAM,heaptable1,0100,Server,SQL,范围,分配,页面
From: https://www.cnblogs.com/lkj371/p/17581733.html

相关文章

  • 转:MySQL数据库给表添加索引
    MySQL数据库给表添加索引   ......
  • SQL语言可以分为四类
    SQL(StructuredQueryLanguage,结构化查询语言)是用于管理关系数据库系统的标准化语言。SQL语言可以分为以下几个方面:数据定义语言(DDL):用于定义和管理数据库中的结构,包括创建、修改和删除数据库对象(如表、视图、索引等)。例如:CREATETABLE、ALTERTABLE、DROPTABLE等。......
  • MyBatis-Plus这样实现动态SQL
    拦截器介绍拦截器是一种基于AOP(面向切面编程)的技术,它可以在目标对象的方法执行前后插入自定义的逻辑。MyBatis定义了四种类型的拦截器,分别是:Executor:拦截执行器的方法,例如update、query、commit、rollback等。可以用来实现缓存、事务、分页等功能。ParameterHandler:拦截参......
  • How to make sqlplus output appear in one line
    Howtomakesqlplusoutputappearinonelinehttps://dba.stackexchange.com/questions/54149/how-to-make-sqlplus-output-appear-in-one-line#SQL*PlusUser'sGuideandReferencehttp://docs.oracle.com/cd/E16655_01/server.121/e18404/ch_twelve040.htm#BAC......
  • Using PL/SQL Object Types for JSON
    #https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/using-PLSQL-object-types-for-JSON.html#GUID-F0561593-D0B9-44EA-9C8C-ACB6AA9474EEDECLAREjeJSON_ELEMENT_T;joJSON_OBJECT_T;BEGINje:=JSON_ELEMENT_T.parse('{"name......
  • 万字长文浅析配置对MySQL服务器的影响
    有很多的服务器选项会影响这MySQL服务器的性能,比如内存中临时表的大小、排序缓冲区等。有些针对特定存储引擎(如InnoDB)的选项,也会对查询优化很有用。调整服务器的配置从某种程度来说是一个影响全局的行为,因为每个修改都可能对该服务器上的每个查询造成影响。不过有些选项是针对特......
  • 从另一电脑复制下来的MYSQL的数据文件(包括FRM IBD)快速恢复到另一MYSQL服务器过程
    从另一电脑复制下来的MYSQL的数据文件(包括FRMIBD)快速恢复到另一MYSQL服务器过程:1.安装mysql最好相同的版本,安装Navicateformysql,连接相应的服务器2.安装mysql-utilities,地址:https://downloads.mysql.com/archives/utilities/以恢复td_gov_company_abnormal.frm为例:3.C......
  • MySQL group by分组后,将每组所得到的id拼接起来
    背景需要将商品表中的sku按照spu_id分组后,并且得到每个spu下的sku_id,需要使用到group_concat函数selectspu_id,count(*),group_concat(idSEPARATOR',')asidsfromproduct_skuwherecategory='tv'groupbyspu_id;group_concat函数group_concat函数,实现分组查......
  • MySQL查询阻塞该如何解决
    MySQL是广泛使用的开源数据库管理系统,它提供了方便的查询功能。然而,在高并发访问的情况下,可能出现查询阻塞的情况。下面是一些解决此问题的方法。SHOWFULLPROCESSLIST;可以使用上述命令查看所有正在执行的SQL查询,并查看它们是否阻塞其他查询。如果有查询阻塞了其他查询,可以使......
  • Mysql主从复制
    介绍MySQL主从复制时一个异步的复制过程,底层时基于MySQL数据库自带的二进制日志功能。就是一台或者多台MySQL数据库(slave从库)从另一台MySQL(master主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制时MySQL数据库自带功能,无......