zoukankan      html  css  js  c++  java
  • 【转】SQL Server 存储:理解IAM 页

    原文地址:http://www.cnblogs.com/woodytu/p/4488930.html

    在以前的文章里,我们讨论了数据页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数据类型的表。这样我们的表就包含里三类分配单元。

    复制代码
     1 USE InternalStorageFormat
     2 GO
     3 
     4 CREATE TABLE IAMTable(
     5 Id INT,
     6 col1 VARCHAR(3000),
     7 col2 VARCHAR(3000),
     8 col3 VARCHAR(3000),
     9 Lobdata NTEXT)
    10 GO
    复制代码

    我们往表里插入数据

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

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

    1 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命令查看页面分配情况。

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

    图1

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

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

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

    1 DBCC TRACEON(3604)
    2 go
    3 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页的信息。

    复制代码
    1 INSERT  INTO IAMTable
    2 VALUES  ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' )
    3 go 7
    4 
    5 DBCC TRACEON(3604)
    6 go
    7 DBCC PAGE('InternalStorageFormat',1,175,3)
    复制代码

    可以看到

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

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

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

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

     

    参考文章: 

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

  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/FH-cnblogs/p/7071000.html
Copyright © 2011-2022 走看看