SQL Server 存储(5/8):索引分配映射(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 列中存储的可变长度数据。 

IAM用来跟踪表的指定allocation units在分区的GAM里页或区的分配情况,IAM页page type为10

我们创建一个包含3列varchar(3000)、1列LOB、1列int类型的表,这样我们的表就包含三类分配单元。

 

USE InternalStorageFormat
GO

CREATE TABLE IAMTable(
Id INT,
col1 VARCHAR(3000),
col2 VARCHAR(3000),
col3 VARCHAR(3000),
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页,用来跟踪In-row data和LOB data的分配。因为当前的记录大小不足以创建ROW_OVERFLOW_DATA,没有分配一个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)

图1

现在表已经有了3类分配单元,如果我们这表上有更多的分区,那就每个区都有独立的一系列IAM页。

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

现在我们已经知道了IAM页的用处,让我们一起看看在IAM页里是什么样的。从刚才的图片我们知道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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章