IAM页面全称为索引分配映射页,是数据库存储结构中用于记录数据页分配情况的重要页面,它的分配区域规则是很多开发者关注的问题。IAM页面既不会在统一区分配,也不会在混合区分配,而是有独立的分配逻辑。

IAM页面的基础作用
IAM页面的核心作用是跟踪一个存储对象(比如表、索引)所使用的数据页范围,每个IAM页面可以覆盖一个磁盘文件中的4GB范围,通过位图的方式标记对应范围内哪些区已经被分配给该对象使用。
和普通数据页、索引页不同,IAM页面不需要存储实际的数据内容,只需要记录分配映射信息,因此它的分配规则和其他类型的页面有本质区别。
统一区和混合区的分配规则
在数据库的区分配机制中,区是8个连续数据页的集合,分为两种类型:
- 混合区:区内的8个数据页可以分配给不同的存储对象,适合存储较小的对象,避免空间浪费。
- 统一区:区内的8个数据页全部分配给同一个存储对象,适合存储较大的对象,提升访问效率。
普通的数据页、索引页会根据对象的大小选择分配到混合区或者统一区:当对象大小小于8页时,优先从混合区分配页面;当对象大小达到8页后,后续页面会从统一区分配。
IAM页面的独立分配逻辑
IAM页面不属于普通的数据页或索引页,因此它不会遵循混合区和统一区的分配规则。IAM页面的分配逻辑如下:
- 每个存储对象在创建时,会首先分配一个IAM页面,这个IAM页面会从一个特殊的全局混合区中分配,这个全局混合区专门用于存储IAM页面,不会分配给普通的数据或索引对象。
- 如果一个存储对象需要覆盖的范围超过单个IAM页面的4GB限制,会额外分配新的IAM页面,新的IAM页面同样从全局混合区中分配。
我们可以通过以下示例查看IAM页面的分配情况,假设我们创建一个测试表:
-- 创建测试表
CREATE TABLE Test_IAM (
ID INT PRIMARY KEY,
Name VARCHAR(50)
);
-- 查看表的页分配情况,包含IAM页面信息
DBCC IND('TestDB', 'Test_IAM', -1);
执行上述命令后,返回结果中Page Type为10的记录就是IAM页面,你可以看到这些页面的分配区域不会标记为普通混合区或统一区,而是属于专门的IAM页面分配池。
常见误区说明
很多开发者会误以为IAM页面会和其他页面一样,先分配到混合区,再转到统一区,这个认知是错误的。因为IAM页面的作用是跟踪区的分配,它本身的分配需要独立于普通对象的区分配逻辑,否则会出现循环依赖的问题:如果IAM页面需要从混合区分配,而混合区的分配信息又需要IAM页面来记录,就会导致逻辑矛盾。
注意:不同数据库引擎的IAM页面实现可能有细微差异,但核心逻辑都是IAM页面独立于统一区和混合区的分配规则,不会归属到这两类区中。
总结
IAM页面既不在统一区分配,也不在混合区分配,它有独立的全局混合区分配池。理解这个规则可以帮助我们更清晰地掌握数据库存储结构的底层逻辑,避免在分析页分配、存储空间使用相关问题时出现认知偏差。如果需要确认具体环境中IAM页面的分配情况,可以通过数据库提供的页查看命令进行验证。