作为培训师多年,当学员学完Oracle第10章或11g相关章节时,经常搞不清IOT和mapping table的那些事,就请让我几句话道出这俩位的真相:
1)当你创建了一个IOT 表,想在上面的其中一列(当然是非主键的其他列)建立位图索引(注意不是普通的b树),你必须建立一个mapping table。----必需的,注意到没有mapping table时的报错信息了吗?南京OCP培训
2)查user_objects,查出IOT的object_id。用这个object_id:
select * from dba_tables where table_name like '%刚才查到的object_id%'南京OCP培训
找到带mapping字眼的那个表,它就是mapping table。
3)注意到Mapping table 是个heap table, 用来存储IOT的逻辑rowid。 Mapping table的每一行存储了对应的IOT表中记录的logical rowid。因此这个mapping table 就维护了IOT表的行位置关系。南京Oracle培训
4)为什么要这样做呢?
因为bitmap索引条目中保存的rowid 要用physical rowid, 而IOT 是无法提供稳定的physical rowid 的,因此bitmap index就只能记录mapping table 的physical rowid。通过bitmap 索引来访问的执行计划大概就是首先根据bitmap index中记录的mapping table physical rowid 访问mapping table, 然后通过mapping table 中的logical rowid 再来访问IOT 表。