SQL Server 存储(5/8):理解IAM 页

时间:2022-03-04 09:03:12

在以前的文章里,我们讨论了数据页GAM和SGAM,还有PFS页。今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页。

在SQL Server 2005和以后的版本里,分配单元(allocation units)以下三个类型:

  • IN_ROW_DATA

    用于存储堆分区或索引分区,即heap和B-tree。

  • LOB_DATA

    用于存储大型对象 (LOB) 数据类型,例如 xml、varbinary(max) 和 varchar(max)。

  • ROW_OVERFLOW_DATA

    用于存储超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中存储的可变长度数据。

在我们讨论GAM和SGAM页时,我们注意到,一个GAM页可以跟踪4GB的空间并每4GB空间增加一个GAM页。一个IAM页是用来跟踪,表的指定分配单元,在分区的GAM区间里,页或区的分配情况。让我们通过实例来演示下。

我们创建一个包含3列varchar(3000)数据类型和1列LOB数据类型,还有一列INT数据类型的表。这样我们的表就包含里三类分配单元。

 USE InternalStorageFormat
GO CREATE TABLE IAMTable(
Id INT,
col1 VARCHAR(),
col2 VARCHAR(),
col3 VARCHAR(),
Lobdata NTEXT)
GO

我们往表里插入数据

 INSERT  INTO IAMTable
VALUES ( 1, 'A', 'B', 'C', N'Test' )

这里我们插入的1条数据不会生成溢出行(row overflow)。我们使用DBCC IND命令列出分配给这个表的页。

 DBCC IND('InternalStorageFormat','IAMTable',1)

SQL Server 存储(5/8):理解IAM 页

从上图可以清楚看到,SQL Server为我们这个表分配了2个IAM页(page type为10),用来跟踪In-row data和LOB data的分配。因为当前的记录大小不足以创建ROW_OVERFLOW_DATA,SQL Server没有给我们分配一个IAM页来跟踪ROW_OVERFLOW_DATA的分配。

我们来插入一条可以让SQL Serve生成ROW_OVERFLOW_DATA,并用DBCC IND命令查看页面分配情况。

 INSERT  INTO IAMTable
VALUES ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' ) DBCC IND('InternalStorageFormat','IAMTable',1)

SQL Server 存储(5/8):理解IAM 页

现在表已经有了所有这3类分配单元。如果我们这表上有更多的分区,那就每个区都有独立的一系列IAM页。下图可以给你一个清晰的展示。
SQL Server 存储(5/8):理解IAM 页

简而言之,堆或B树结构至少有一个IAM页,最多有3倍分区个IAM页。如果表继续增长,页分配在不同的GAM区间,会有更多的IAM页增加。这些IAM页会链接起来,这个列表叫IAM链。

SQL Server 存储(5/8):理解IAM 页

现在我们已经知道了IAM页的用处,让我们一起看看在IAM页里是什么样的。我们知道,表或索引的第一个8页会分配在混合区的单个页面里。从刚才的图片我们知道175页是用来跟踪in-row data分配单元的IAM页,我们用DBCC PAGE命令看看页里面的信息是什么。

 DBCC TRACEON(3604)
go
DBCC PAGE('InternalStorageFormat',1,175,3)

SQL Server 存储(5/8):理解IAM 页

在 IAM:Header区域,我们看到下列字段:

  • sequenceNumber = 0          这是IAM页在IAM链中的位置。在IAM链中每增加1个IAM页,这里会加1。
  • status = 0x0                       未使用。
  • objectId = 0                        未使用。
  • indexId = 0                         未使用。
  • page_count = 0                   未使用。
  • start_pg = (1:0)                  这是页面映射的GAM区间。保存着在映射的GAM区间的第一个页ID。

Single Page allocation 区域:这里显示的是从混合区分配的第1个8页。在第8页后,SQL开始从统一区分配。因此这个部分只用在第一个IAM页链。174和210页是从混合区分配的,这个和刚才DBCC IND('InternalStorageFormat','IAMTable',1)输出结果一致。

SQL Server 存储(5/8):理解IAM 页

SQL Server 存储(5/8):理解IAM 页

Extent Alloc 区域:这里显示的是分配单元区分配。

我们执行下列语句,往表里插入7条记录,这样的话,我们表里就有9条记录了,再用DBCC PAGE看下IAM页的信息。

 INSERT  INTO IAMTable
VALUES ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' )
go 7 DBCC TRACEON(3604)
go
DBCC PAGE('InternalStorageFormat',1,175,3)

SQL Server 存储(5/8):理解IAM 页

可以看到

红色区域:自174,210之后,增加了212,214,215,217, 218,220,共8个页面,即混合区分配完成。

蓝色区域:从224开始分配统一区了。

使用DBCC IND查看下页面分配情况,完全一致:

 DBCC IND('InternalStorageFormat','IAMTable',1)

SQL Server 存储(5/8):理解IAM 页

参考文章:

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/07/sql-server-understanding-the-iam-page/

SQL Server 存储(5/8):理解IAM 页的更多相关文章

  1. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  2. SQL Server :理解IAM 页

    原文:SQL Server :理解IAM 页 在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. ...

  3. SQL Server 存储(3/8):理解GAM和SGAM页

    我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...

  4. SQL Server存储(6/8) :理解DCM页

    我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map:DCM ),还有差异备份(differen ...

  5. SQL Server 存储(8/8):理解数据文件结构

    这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的. 我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位.SQL Server把数据文件里的第1页标记为 ...

  6. SQL SERVER存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  7. SQL Server存储ntext截断问题

    SQL Server存储ntext截断问题   最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...

  8. SQL Server存储(7/8) :理解BCM页

    今天我们来讨论下批量更改映射(Bulk Changed Map:BCM)页,还有大容量日志恢复模式( bulk logged recovery model )如何运作的. 批量更改映射(Bulk Ch ...

  9. SQL Server 存储(4/8):理解Page Free Space (PFS) 页

    我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面*空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...

随机推荐

  1. 网页万能排版布局插件,web视图定位布局创意技术演示页

    html万能排版布局插件,是不是感觉很强大,原理其实很简单,不过功能很强大哈哈,大量节省排版布局时间啊! test.html <!doctype html> <html> &l ...

  2. delegate基于on

    前几天看到事件委托的时候,关于live()方法讲的不是很详细,就去搜了一下关于live()和delegate()的,最后看源码发现bind()和delegate()都是由on()实现的,感兴趣的朋友可 ...

  3. DBA&lowbar;Oracle Erp R12中文补丁安装升级(案例)

    2014-07-11 Created By BaoXinjian

  4. [terry笔记]IMPDP报错ORA-39083 Object type TYPE failed to create ORA-02304

    今天在使用impdp导入的时候(同一数据库中转换schema),遇到了 ORA-39083: Object type TYPE failed to create with error: ORA-023 ...

  5. 咏南C&sol;S开发框架支持最新的DELPHI XE8开发

    特大好消息:咏南C/S开发框架支持最新的DELPHI XE8开发!咏南开发框架让你再无开发工具升级后顾之忧! 购买咏南开发框架送项目源码!

  6. YII中的表单挂件

    利用助手(widget)在页面实现表单 控制器中 <?php class YiiFormController extends Controller { public function actio ...

  7. ThinkPHP 3&period;2 开放 cache注缓存,过滤非法字符

    打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...

  8. istio入门(04)istio的helloworld-部署构建

    参考链接: https://zhuanlan.zhihu.com/p/27512075 安装Istio目前仅支持Kubernetes,在部署Istio之前需要先部署好Kubernetes集群并配置好k ...

  9. JS中some&lpar;&rpar;&comma;every&lpar;&rpar;&comma;forEach&lpar;&rpar;&comma;map&lpar;&rpar;&comma;filter&lpar;&rpar;区别

    JS在1.6中为Array新增了几个方法map(),filter(),some(),every(),forEach(),也就是一共有这么多方法了. 刚开始接触这些倒也记得不是很清楚,在此纪录一下以加深 ...

  10. 使用DataContext和ItemsSource将数据源绑定到ListView上的区别

    在最近的一个项目中,将DataView类型的数据源绑定到ListView控件时,发现当DataView的内容发生变化时,前台的ListView控件的内容并没有发生改变,在这里我先贴出前台要绑定数据源的 ...