SQL Server2000中的IAM链

来源:互联网 发布:淘宝网民族风连衣裙 编辑:程序博客网 时间:2024/05/18 02:35

SQL Server2000中的IAM链



原文地址:
http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/24/645803.aspx

   IAM(Index Allocation Map,索引分配映射)页用来跟踪单个文件中约4G大小的空间,跟踪的空间是按4G字节对齐。被跟踪的这4G大小的页被称为“GAM区间”(GAM Interval)。IAM页所跟踪的GAM区间中的空间是属于同一实体的(这里,我选择的是“实体”而没有使用SQL Server中的“对象”)。下面我们将了解IAM页的结构。

    因为IAM只是跟踪单个文件里的一个GAM区间里的空间。若一个数据库包括多个文件,或者一些文件大小超过4G,并且实体分配的空间恰好跨越多个文件或跨越一个文件的多个GAM区间,那么你就会看到为了跟踪单个实体的所有空间是如何使用多个IAM页的了。

    这时就要用到IAM链了。它是一个IAM页的链表,该链表将所有用来跟踪同一实体的分配空间的所有IAM页链接在一起。该链表并不排序,当需要一个新的IAM页时便添加进链表。链表中的IAM页是编号的,这个编号也是按添加时的顺序增加的。

    到底是谁使用IAM链?——实体。这个概念在SQL SERVER 2000和2005中区别很大,所以我要用两篇文章来介绍它。
在SQL Server2000中,下面每个实体都有一个IAM链表:
1)    堆或聚集索引
a)    一个表只能选其一,不能两者皆有。
b)    它们的索引ID分别为0和 1。
2)    非聚集索引
a)    它的索引ID从2到250。
3)    文本存储
a)    对于堆或者聚集索引中的LOB列
b)    有时也被称为“文本索引”
c)    它拥有一个固定的索引ID值255。

    很简单吧?我总结为:在SQL SERVER 2000中,每一个索引一个IAM链(如果你还记得IAM叫“索引分配映射”的话,我觉得还是很贴切的)。

    到底IAM页是如何跟踪GAM区间中空间使用的呢?每个IAM页有两个纪录(record):IAM头部和位图。

    IAM头部记录着IAM链的一些元数据,包括:
1)    IAM页映射的GAM区间(译注:开始的页号)
2)    IAM页在IAM链表中的顺序号
a)    一个新的页增加到链表中时,该序号便增加1
b)    这些页使用页的向前和向后指针(在页头部,不在IAM头部)链接的。并且链接时是严格按顺序号的。
3)    链表映射的索引的对象和索引ID
a)    IAM链中所有的IAM页(和所有分配给该索引的页)都在头部有同样的对象和索引ID。

    IAM页头部还有一个单页的数组。这只是在IAM链中的第一个IAM页中,用来跟踪分配给索引的页而不是区(一个区是8个连续的页)的。(译注:给索引分配空间,前8页是按页在混合区中分配的;超过8个页后才开始按区分配)

    位图占用IAM页剩下的空间,每一位表示GAM区间中的每一个区。如果区被分配给该索引,那么对应位就置1,否则为0。很明显,为不同索引映射同一GAM区域的两个IAM页不可能有相同的位被置上。
   
    你可以使用DBCC PAGE命令来查看IAM页的内容。关于IAM链,还需要注意一些事:
1)    它们不是自引用的(也就是说他们并不跟踪IAM页自己使用的空间)
2)    如果一些数据删除了,从而导致空间被收回,GAM区间中没有任何空间再被分配给索引了,但是IAM页是不会被删除的。
3)    只有下面的操作会将页从IAM链表中删掉:TRUNCATE TABLE,DROP TABLE,还有DBCC CHECKDB的一些修补动作。
4)    DBCC INDEXDEFRAG会为索引拷贝一份IAM链,并且按文件和GAM区间排序以便计算出下面每个文件的下一个区/页。
5)    IAM链的修补工作是异常复杂的。

    我将在下面一篇文章中介绍SQL SERVER 2005的不同的地方。

原创粉丝点击