当前位置:Gxlcms > 数据库问题 > SQL Server :理解IAM 页

SQL Server :理解IAM 页

时间:2021-07-01 10:21:17 帮助过:5人阅读

在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数据类型的表。这样我们的表就包含里三类分配单元。

  1. <span style="color: #008080;"> 1</span> <span style="color: #000000;">USE InternalStorageFormat
  2. </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">GO
  3. </span><span style="color: #008080;"> 3</span>
  4. <span style="color: #008080;"> 4</span> <span style="color: #000000;">CREATE TABLE IAMTable(
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #000000;">Id INT,
  6. </span><span style="color: #008080;"> 6</span> col1 VARCHAR(<span style="color: #800080;">3000</span><span style="color: #000000;">),
  7. </span><span style="color: #008080;"> 7</span> col2 VARCHAR(<span style="color: #800080;">3000</span><span style="color: #000000;">),
  8. </span><span style="color: #008080;"> 8</span> col3 VARCHAR(<span style="color: #800080;">3000</span><span style="color: #000000;">),
  9. </span><span style="color: #008080;"> 9</span> <span style="color: #000000;">Lobdata NTEXT)
  10. </span><span style="color: #008080;">10</span> GO

我们往表里插入数据

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span><span style="color: #000000;"> IAMTable
  2. </span><span style="color: #008080;">2</span> <span style="color: #0000ff;">VALUES</span> ( <span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">B</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">C</span><span style="color: #ff0000;">‘</span>, N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">Test</span><span style="color: #ff0000;">‘</span> )

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

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">DBCC</span> IND(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">InternalStorageFormat</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">IAMTable</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>)

技术分享

从上图可以清楚看到,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命令查看页面分配情况。

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span><span style="color: #000000;"> IAMTable
  2. </span><span style="color: #008080;">2</span> <span style="color: #0000ff;">VALUES</span> ( <span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">Test</span><span style="color: #ff0000;">‘</span><span style="color: #000000;"> )
  3. </span><span style="color: #008080;">3</span>
  4. <span style="color: #008080;">4</span> <span style="color: #0000ff;">DBCC</span> IND(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">InternalStorageFormat</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">IAMTable</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>)

技术分享

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

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

技术分享

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

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">DBCC</span> TRACEON(<span style="color: #800000; font-weight: bold;">3604</span><span style="color: #000000;">)
  2. </span><span style="color: #008080;">2</span> <span style="color: #0000ff;">go</span>
  3. <span style="color: #008080;">3</span> <span style="color: #0000ff;">DBCC</span> PAGE(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">InternalStorageFormat</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>,<span style="color: #800000; font-weight: bold;">175</span>,<span style="color: #800000; font-weight: bold;">3</span>)

技术分享

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页的信息。

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span><span style="color: #000000;"> IAMTable
  2. </span><span style="color: #008080;">2</span> <span style="color: #0000ff;">VALUES</span> ( <span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), <span style="color: #ff00ff;">REPLICATE</span>(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">3000</span>), N<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">Test</span><span style="color: #ff0000;">‘</span><span style="color: #000000;"> )
  3. </span><span style="color: #008080;">3</span> <span style="color: #0000ff;">go</span> <span style="color: #800000; font-weight: bold;">7</span>
  4. <span style="color: #008080;">4</span>
  5. <span style="color: #008080;">5</span> <span style="color: #0000ff;">DBCC</span> TRACEON(<span style="color: #800000; font-weight: bold;">3604</span><span style="color: #000000;">)
  6. </span><span style="color: #008080;">6</span> <span style="color: #0000ff;">go</span>
  7. <span style="color: #008080;">7</span> <span style="color: #0000ff;">DBCC</span> PAGE(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">InternalStorageFormat</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>,<span style="color: #800000; font-weight: bold;">175</span>,<span style="color: #800000; font-weight: bold;">3</span>)

技术分享

可以看到

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

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

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

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">DBCC</span> IND(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">InternalStorageFormat</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">IAMTable</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>)

 技术分享

 

SQL Server :理解IAM 页

标签:

人气教程排行