一、MSSQLextent分两种: 1. Mixed extent:每个表或索引创建时,MSSQL并不给它分配一个extent,而是在mixed extnet内分配一个页,空间需求扩大时,再分配一个…,直到表或索引的空间需求超过8个页,系统为它分配一个extent,这个extent就是uniform. extent; 2. Uniform. extent:当表或索引的空间需求超过8个页时,系统就为它分配一个uniform. extent; 二、MSSQL用几种页来记录extent的使用: 1. GAM:global allocation map,用来记录extent是否已经被使用,每个位记录一个extent,0为已用,1表示未用,一个页大约有8000字节、64000个位,每个GAM页可以记录64000个extent,每个extent为8*8k=64k,那么GAM页最终可以记录64k*64000大小的空间,即大约4G的空间,也就是说GAM只能记录4G大小的空间,超过4G必须另外分配GAM,第一和第二个GAM间隔511230个页,第一个GAM总是文件的第三个页(page 2); 2. SGAM:shared global allocation map,用来记录extent是否被用作mixed extent,每个位记录一个extent,如果为1,说明对应的extent用作mixed extent且其中还有可用的页,为0,说明其为uniform. extent或mixed extent但已没可用页。同样,一个SGAM可以记录4G的空间,超过这个大小就需要另外分配SGAM,第一个和第二个SGAM间隔511230个页,第一个SGAM总是文件的第四个页(page 3); 3. 另外一种页——IAM,index allocation map,用来记录每个对象在一个文件中extents的情况,也就是记录对象被分配了一个文件中的extents,IAM页头有八个槽,分别用来指向表或索引的头八个页,因为它们都被分配在mixed extents里,后面页头还有一个map,其中每个位对应一个extent,如果相应文件中extent的位是1,就说明这个extent属于该对象,否则,就不属于该对象;该页可以在文件的任何位置分配,它也可以不指向它所在文件的extents,注意:IAM仅仅对应被一个分配单位使用的文件中的4G范围的extents使用情况,对应511230个页,一旦超过这些页,系统就要分配另外一个IAM页,一个对象的各个IAM也都被链接在一起,IAM头部有指向第一个extent的地址。每个分配单位中,只包含一个表或索引分区的一类页,多个分区要用到多个IAM,而同一个分区不同类的页,也要用到不同的IAM页。 4. PFS, page free space,用来记录每个文件中每个页如何使用的,文件的第二个页为PFS页,其后第8088个也是PFS页,因为一个PFS页中只有8088个字节可以用来记录页的使用情况。 5. DCM,differential changed map,用来记录自从上次全备以来改变过的extents,主要用于差异备份需要,文件的第七个页(page 6)为DCM页,也是只能覆盖4G的空间,超过4G就要分配另一个DCM页,中间要间隔511230个页。 6. BCM,bulk changed map,用来记录最小或批量日志操作改变的extents,文件的第八个页为BCM页,只能覆盖4G的空间,超过4G就要重新分配BCM页,中间间隔511230个页。 7. 至此,可以总结如下:文件的第一个页为文件头页,即page 0,第二个页为PFS页,第三个页为GAM页,第四个页为SGAM页,第七个页为DCM页,第八个页为BCM页,而IAM页可以在文件任何位置分配。

05-11 13:45