在以前的文章里,我们讨论了数据页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为我们这个表分配了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)

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

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

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

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

在 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)输出结果一致。

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)

可以看到

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

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

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

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

参考文章:

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. linux安装oracle 11g rac

    安装oracle 11gR2 RAC 一.网络规划及安装虚拟主机 主机名 主机版本 Ip rac1.localdomain Redhat 6.5 RAC节点1 192.168.100.11 rac2. ...

  2. GnuPG 1.4.15 发布,邮件加密工具

    GnuPG 1.4.15 改进包括: * Fixed possible infinite recursion in the compressed packet parser. [CVE-2013-44 ...

  3. How and Where Concurrent Asynchronous I/O with ASP.NET Web API 对异步编程分析的非常的好

    How and Where Concurrent Asynchronous I/O with ASP.NET Web API http://www.tugberkugurlu.com/archive/ ...

  4. 用JQ仿造百度书籍预售页面的单屏滚页效果

    今天的项目需要做到一个介绍页面,我主动提出走单屏滚页的风格,毕竟交互性好,逼格也高,具体效果可以参照百度知道书籍预售页面. 其实现效果就大概是这样的: 还是老样子,所有步骤文件可以从我的Github上 ...

  5. dojo/dom-style样式操作学习笔记

    基础总结 一个元素的样式信息由三个来源根据层叠规则确定.三个来源分别是: 由DOM元素style特性设置的内联样式 由style元素中嵌入的样式规则 由link元素引入的外部样式表 元素的样式 任何支 ...

  6. JavaScript思维导图—字符串函数

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  7. CocoSocket开源下载与编写经验分享

    CocoSocket分享 cocos2dx 3.1都出了,但依然没有发现与它原生的SOCKET支持,于是,这几天在家,手工撸了一个. 目前版本对IOS,ANDROID,WINDOWS支持良好.且为异步 ...

  8. java指定路径写、读文件

    package com.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

  9. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

  10. Java基础之常用类

    1.Collections类: (1)此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. (2)静态方法摘要: static <T> boolea ...