none
对象或文件和IAM关系如何? RRS feed

  • 问题

  • 请假高手们:

    MSDN:索引分配映射 (IAM) 页映射分配单元使用的数据库文件的 4 GB 部分中的区。
    问题1:上面的意思是说 某个文件中IAM页 只是映射此文件中 某个分配单元(如:In_Row_Data)的4GB的区,还是说IAM也只是映射某个 对象(表或索引)在此文件中的 In_Row_Data?

    假设现在有TB 是个堆。并且其数据分布于3个文件 File1,File2,File3,现在进行表扫描。将会通过IAM链来进行扫描。

    问题2:如果现在File1<4GB,其中有1GB的数据存储了TB表的数据,那么在File1中的IAM页是否覆盖了整个File1的所有区?包括TB使用的1GB以外的其他表使用的区。

    问题3:一个文件中的IAM页的个数和什么有关?
    2009年10月16日 9:18

全部回复

  • 1. not just for in_row_data, for log_data and row_overflow_data too.
    2. no, each partition of a heap or index contains at least an IAM for IN_ROW_DATA allocation unit.
    3. file size and number of table/index.
    2009年10月16日 21:33
  • 1. not just for in_row_data, for log_data and row_overflow_data too.
    2. no, each partition of a heap or index contains at least an IAM for IN_ROW_DATA allocation unit.
    3. file size and number of table/index.

    不好意思,我不怎么明白。
    其实我的意思是IAM如何映射分配单元的,
    IAM是映射分配单元所使用的区,这里对的分配单元所使用的区有没有什么要求,比如说 必须是某个对象(表或索引)在IAM页所在文件中的分配单元,还是不管此分配单元是否属于某个对象 IAM 都有可能映射?换句话说就是,一个IAM页里面可以映射不同对象的分配单元所使用的区,这样理解是否正确?
    2009年10月19日 3:33
  • 下面这个是Inside Microsoft SQL Server 2005: The Storage Engine里面说的。

    1. IAM只是映射某个表/索引的某个分区的某个类型的页在文件中的4GB部分的分配情况。
       一个IAM只管一个对象。所有对象(也就是也页分配情况)那是GAM和SGAM。

    2. IAM会覆盖整个4GB区,用于表明其中哪些区(extend)属于它。

    3. 这个问题rmiao讲了:和文件大小,其中存放的对象个数及其页种类有关。
    2009年10月19日 9:24
  • 先说明一下IAM页面。一个IAM只能映射某一个表分区的某一种类型的页面,并且最多覆盖4GB的大小。比如:一个表有四个分区,每个分区都包含三种类型的数据(in-row, LOB, and row-overflow),那它最少会有4*3 = 12 个IAM页面,若个任何一个分区的任何一种数据类型超过4G或任意一个表分区跨越多个文件,就需要更多的IAM。根据以上概念,你的问题的回答是:
    1)某个文件中的IAM只映射一个表分区的某种数据类型
    2) 我的理解是IAM不能跨越不同的表,所以你说的情况需要多个IAM如果这个文件包括多于一个表
    3)一个文件中的表(分区)的个数*包含的数据类型,如果任何一个分区类型超过4G, 需要更多的IAM

    以下是inside SQL Server 的一些原文,希望有帮助:

    Index Allocation Map (IAM) pages keep track of the extents in a 4-GB section of a database file used by an allocation unit. An allocation unit is a set of pages belonging to a single partition in a table or index and comprises pages of one of three types: pages holding regular in-row data, pages holding Large Object (LOB) data, or pages holding row-overflow data. I'll discuss these three types of pages, and when each kind is used, in Chapter 6.

    For example, a table on four partitions that has all three types of data (in-row, LOB, and row-overflow) will have at least 12 IAM pages. Again, a single IAM covers only a 4-GB section of a single file, so if the partition spans files, there will be multiple IAM pages, and if the file is more than 4 GB in size and the partition uses pages in more than one 4-GB section, there will be additional IAM pages.

    2009年10月20日 3:46
  • 你可以使用DBCC page命令查看一下iam页的内容,里面包含了该也所指向的数据/索引页的范围
    下面是一个例子

    Slot 0 = (1:173)                     Slot 1 = (1:90)                      Slot 2 = (1:120)
    Slot 3 = (1:121)                     Slot 4 = (1:126)                     Slot 5 = (1:151)
    Slot 6 = (1:1480)                    Slot 7 = (1:1481)                   
    IAM: Extent Alloc Status Slot 1 @0x4179C0C2

    (1:0)        - (1:1832)     = NOT ALLOCATED                              
    (1:1840)     - (1:1856)     =     ALLOCATED                              
    (1:1864)     - (1:2672)     = NOT ALLOCATED                              


    SQL SERVER Engine Test
    2009年10月20日 5:43
    版主
  • 先说明一下IAM页面。一个IAM只能映射某一个表分区的某一种类型的页面,并且最多覆盖4GB的大小。比如:一个表有四个分区,每个分区都包含三种类型的数据(in-row, LOB, and row-overflow),那它最少会有4*3 = 12 个IAM页面,若个任何一个分区的任何一种数据类型超过4G或任意一个表分区跨越多个文件,就需要更多的IAM。根据以上概念,你的问题的回答是:
    1)某个文件中的IAM只映射一个表分区的某种数据类型
    2) 我的理解是IAM不能跨越不同的表,所以你说的情况需要多个IAM如果这个文件包括多于一个表
    3)一个文件中的表(分区)的个数*包含的数据类型,如果任何一个分区类型超过4G, 需要更多的IAM

    以下是inside SQL Server 的一些原文,希望有帮助:

    Index Allocation Map (IAM) pages keep track of the extents in a 4-GB section of a database file used by an allocation unit. An allocation unit is a set of pages belonging to a single partition in a table or index and comprises pages of one of three types: pages holding regular in-row data, pages holding Large Object (LOB) data, or pages holding row-overflow data. I'll discuss these three types of pages, and when each kind is used, in Chapter 6.

    For example, a table on four partitions that has all three types of data (in-row, LOB, and row-overflow) will have at least 12 IAM pages. Again, a single IAM covers only a 4-GB section of a single file, so if the partition spans files, there will be multiple IAM pages, and if the file is more than 4 GB in size and the partition uses pages in more than one 4-GB section, there will be additional IAM pages.

    谢谢,不过还是有问题。

    IAM的大位图用于映射某个对象在文件中的4GB
    的意思是说 如果是 表TB的IAM(假如映射IN_ROW_DATA分配单元),
    那么这个IAM的大位图中覆盖的所有的区都是TB的数据所在的区,还是说 IAM大位图中的位所覆盖的区只是属于IAM所在文件中 的4GB的 IN_ROW_DATA分配单元(无论是否属于表TB),只是有一个标识来表明这个位是否属于TB呢?

    我上面所说的覆盖的意思是,比如 IAM 覆盖了 文件中 64000个区
    第一种说法的意思是:这64000个区都是属于 TB的数据存储的区。
    第二种说法的意思是:IAM只是覆盖了64000个区(不管是否是属于TB),如果有64000各区里面只有10000个区是属于TB,那么IAM会用一种标示来表明这10000个区是属于TB表的呢?








    2009年10月20日 6:29
  • 你可以使用DBCC page命令查看一下iam页的内容,里面包含了该也所指向的数据/索引页的范围
    下面是一个例子

    Slot 0 = (1:173)                     Slot 1 = (1:90)                      Slot 2 = (1:120)
    Slot 3 = (1:121)                     Slot 4 = (1:126)                     Slot 5 = (1:151)
    Slot 6 = (1:1480)                    Slot 7 = (1:1481)                   
    IAM: Extent Alloc Status Slot 1 @0x4179C0C2

    (1:0)        - (1:1832)     = NOT ALLOCATED                              
    (1:1840)     - (1:1856)     =     ALLOCATED                              
    (1:1864)     - (1:2672)     = NOT ALLOCATED                              


    SQL SERVER Engine Test

    我用过这个DBCC,我用过两个表做测试。
    IAM: Extent Alloc Status Slot 1 的输出结果来看,觉得不同两个表的对象的IAM页覆盖的空间是一样的。
    比如 TB1 (1:100)     - (1:200)     =     ALLOCATED    
    那么应该 TB2 (1:100)     - (1:200)     =     NOT ALLOCATED 
    感觉是 覆盖了同一片空间,但是通过对覆盖的区进行标示-- 是否 是属于此IAM的 ALLOCATED   。
    2009年10月20日 6:36
  • 你可以使用DBCC page命令查看一下iam页的内容,里面包含了该也所指向的数据/索引页的范围
    下面是一个例子

    Slot 0 = (1:173)                     Slot 1 = (1:90)                      Slot 2 = (1:120)
    Slot 3 = (1:121)                     Slot 4 = (1:126)                     Slot 5 = (1:151)
    Slot 6 = (1:1480)                    Slot 7 = (1:1481)                   
    IAM: Extent Alloc Status Slot 1 @0x4179C0C2

    (1:0)        - (1:1832)     = NOT ALLOCATED                              
    (1:1840)     - (1:1856)     =     ALLOCATED                              
    (1:1864)     - (1:2672)     = NOT ALLOCATED                              


    SQL SERVER Engine Test

    我用过这个DBCC,我用过两个表做测试。
    IAM: Extent Alloc Status Slot 1 的输出结果来看,觉得不同两个表的对象的IAM页覆盖的空间是一样的。
    比如 TB1 (1:100)     - (1:200)     =     ALLOCATED    
    那么应该 TB2 (1:100)     - (1:200)     =     NOT ALLOCATED 
    感觉是 覆盖了同一片空间,但是通过对覆盖的区进行标示-- 是否 是属于此IAM的 ALLOCATED   。

    一个IAM页能够涵盖的最大空间为4GB(你可以想想为什么不能超过4GB),当一个IAM所属的对象大小超过4GB时,就会产生新的。
    对于那些位于mixed extent的页一个iam通过slot来进行标记,我之前的那个例子里有8个slot, 而对于超出部分,就是用extent来表示范围了,在例子中,1:1840~1:1864都属于一个对象.
    SQL SERVER Engine Test
    2009年10月20日 8:11
    版主
  • 你可以使用DBCC page命令查看一下iam页的内容,里面包含了该也所指向的数据/索引页的范围
    下面是一个例子

    Slot 0 = (1:173)                     Slot 1 = (1:90)                      Slot 2 = (1:120)
    Slot 3 = (1:121)                     Slot 4 = (1:126)                     Slot 5 = (1:151)
    Slot 6 = (1:1480)                    Slot 7 = (1:1481)                   
    IAM: Extent Alloc Status Slot 1 @0x4179C0C2

    (1:0)        - (1:1832)     = NOT ALLOCATED                              
    (1:1840)     - (1:1856)     =     ALLOCATED                              
    (1:1864)     - (1:2672)     = NOT ALLOCATED                              


    SQL SERVER Engine Test

    我用过这个DBCC,我用过两个表做测试。
    IAM: Extent Alloc Status Slot 1 的输出结果来看,觉得不同两个表的对象的IAM页覆盖的空间是一样的。
    比如 TB1 (1:100)     - (1:200)     =     ALLOCATED    
    那么应该 TB2 (1:100)     - (1:200)     =     NOT ALLOCATED 
    感觉是 覆盖了同一片空间,但是通过对覆盖的区进行标示-- 是否 是属于此IAM的 ALLOCATED   。

    一个IAM页能够涵盖的最大空间为4GB(你可以想想为什么不能超过4GB),当一个IAM所属的对象大小超过4GB时,就会产生新的。
    对于那些位于mixed extent的页一个iam通过slot来进行标记,我之前的那个例子里有8个slot, 而对于超出部分,就是用extent来表示范围了,在例子中,1:1840~1:1864都属于一个对象.
    SQL SERVER Engine Test


    不能超过4GB的原因是 根据IAM页的大小,只能覆盖64000个区,也就是大位图可以表示64000个区的位。
    但是没有说明 这64000个位 都必须代表某一个对象。目前没有从哪个资料里面看到 。

    你的意思是说 只有 标志位 ALLOCATED    的区才是被 这个IAM页 覆盖的吗?
    如果是这样,那现实 not allocated 的区的意义是什么呢?

    TB1的 IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:336)      = NOT ALLOCATED                              
    (1:344)      - (1:384)      =     ALLOCATED                              
    (1:392)      - (1:504)      = NOT ALLOCATED    


    TB2的 IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:168)      = NOT ALLOCATED                              
    (1:176)      - (1:336)      =     ALLOCATED                              
    (1:344)      - (1:504)      = NOT ALLOCATED   


    看上面的两个 IAM页,属于不同的表 TB1,TB2,他们都显示了 1:504,只是
    对于TB1来说(1:0)        - (1:336)      = NOT ALLOCATED     
    对于TB2来说(1:176)      - (1:336)      =     ALLOCATED    
    也就是说 1-336 对于TB1的IAM来说没有被分配。
    176-336对于TB2的IAM来说被分配了。

    按照你的意思就是说, NOT ALLOCATED     的那个空间,比如 TB1的1-336,在TB1的IAM的大位图中,没有用位来表示出来吗?


    或者 换个问题,我如何查看一个 IAM 页面 所映射的区?是否就是 ALLOCATED  的那些页面所在的区?
    那还要显示 NOT ALLOCATED     是干嘛的?

    2009年10月20日 9:44
  • -----
    2009年10月21日 5:35
  • 顶一个,期待解释
    2009年10月21日 8:14
  • 一个IAM只能属于一个对象,一个IAM可以覆盖最多4GB的空间,并不是说这4GB只属于一个对象, 假设文件里有一段连续的空间(在这里不考虑实际的物理磁盘存储),大小为4GB,这4GB可以包含很多个对象,所以需要iam来进行标识。 对于heap的扫描,sqlserver使用iam来将属于同一个对象但分散在不同位置的页联系起来(当对象是b-tree时,可以能会使用iam)

    TB1 IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:336)      = NOT ALLOCATED                              
    (1:344)      - (1:384)      =     ALLOCATED                              
    (1:392)      - (1:504)      = NOT ALLOCATED    


    TB2
    IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:168)      = NOT ALLOCATED                              
    (1:176)      - (1:336)      =     ALLOCATED                              
    (1:344)      - (1:504)      = NOT ALLOCATED   


    对于TB1来说,除了8个位于mixed extent的页,属于tb1的还有1:344~1:384,   而384~392这段范围的页不能确定是否属于TB1(至少从这种展现形式上我们开不出来)
    对于TB2来说,除了8个位于mixed extent的页,属于tb2的还有1:176~1:336,而336~344这段范围的页不能确定是否属于TB2

    如果是这样,那现实 not allocated 的区的意义是什么呢?
    实际上在页的实际存储里,并没有not allocated这样的标记,出现ALLOCATED和NOT ALLOCATED只是一种展现形式(对于参数为3 的dbcc page命令


    SQL SERVER Engine Test
    2009年10月21日 13:58
    版主
  • 一个IAM只能属于一个对象,一个IAM可以覆盖最多4GB的空间,并不是说这4GB只属于一个对象, 假设文件里有一段连续的空间(在这里不考虑实际的物理磁盘存储),大小为4GB,这4GB可以包含很多个对象,所以需要iam来进行标识。 对于heap的扫描,sqlserver使用iam来将属于同一个对象但分散在不同位置的页联系起来(当对象是b-tree时,可以能会使用iam)

    TB1 IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:336)      = NOT ALLOCATED                              
    (1:344)      - (1:384)      =     ALLOCATED                              
    (1:392)      - (1:504)      = NOT ALLOCATED    


    TB2
    IAM页:
    IAM: Extent Alloc Status Slot 1 @0x63B2C0C2

    (1:0)        - (1:168)      = NOT ALLOCATED                              
    (1:176)      - (1:336)      =     ALLOCATED                              
    (1:344)      - (1:504)      = NOT ALLOCATED   


    对于TB1来说,除了8个位于mixed extent的页,属于tb1的还有1:344~1:384,   而384~392这段范围的页不能确定是否属于TB1(至少从这种展现形式上我们开不出来)
    对于TB2来说,除了8个位于mixed extent的页,属于tb2的还有1:176~1:336,而336~344这段范围的页不能确定是否属于TB2

    如果是这样,那现实 not allocated 的区的意义是什么呢?
    实际上在页的实际存储里,并没有not allocated这样的标记,出现ALLOCATED和NOT ALLOCATED只是一种展现形式(对于参数为3 的dbcc page命令


    SQL SERVER Engine Test


    谢谢您的解答:

    我看了 《sql2005 技术内幕 存储引擎》中的一段话:
    108页
    比特位映射中的每一个比特位代表了该范围内的一个区,而不论该区是否被分配给了拥有该IAM的对象。如果一个比特位是打开的,那么在此范围内相关的区就是被分配给了拥有IAM的对象;如果是关闭的,那么次范围内的区没有被分配给拥有该IAM的对象。

    按照上面的说法 我的理解是
    一个IAM页上 最多可以有 512000 个比特位。
    这些比特位 如果是 打开状态说明 此位代表的区属于 拥有IAM的对象。否则不属于 IAM 的对象。
    也就是说 一个 IAM 页上的位 代表的区 可以不属于 拥有该IAM的对象。
    如果这样的话,那 存储引擎是根据什么来 分配者 512000 个位 所代表的区呢?

    2009年10月21日 16:12
  • 一个页面有8*8K = 64 K比特位,一个区 (extent)包括8个页面,也就是64K。所以一个IAM (GAM或SGAM)页面可以覆盖64K*64K = 4G的范围。
    GAM(global allocation map)的每一比特位表示一个区是否free, 如果一个区是被占用了,标为0,否则为1,SGAM(Shared Global Allocation Map)来表示这个区是被单独的表占用还是多个表共享。因该结合GAM和SGAM的相应比特位来获取该区是否被占用的信息。具体如下:

    Current Use of Extent

    GAM Bit Setting

    SGAM Bit Setting

    Free, not in use

    1

    0

    Uniform extent or full mixed extent

    0

    0

    Mixed extent with free pages

    0

    1


    再说IAM, IAM只属于一个对象,它的比特位只表示该区是否被这个对象占用,即使该区没有被该IAM的对象占用,也可能被其它对象占用。这时需要查GAM和SGAM来开是否该区是free的。

    This posting is provided "AS IS" with no warranties, and confers no rights.
    2009年10月30日 10:45
  • IAM会记录4GB中的所有区并在属于该IAM页对象的区在自己的位图上标识1,未分配给该对象的标识0,4GB中可能拥有多个IAM但是每个IAM页不会在表示相同区的位图上同时标识1。
    2014年8月4日 3:05
  • IAM Page里面有一个bitmap,每个bit对应一个Extent(8页),不是链表,只有一个标头,后面是顺序的。是1表示这个对象有用这个Extent,0表示这个对象没用。


    想不想时已是想,不如不想都不想。


    2014年8月5日 16:49
    版主