我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式。
Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表。IOT表上必须要有主键,而IOT表本身不对应segment,表里所有的数据都存放在主键所在的索引的叶子节点里。
换句话说,在索引叶子节点里的索引条目里不仅存放了被索引的列的值,还同时存放了其他列的值。
对于总是通过主键访问数据的表来说,比较适合使用IOT表。如果使用普通表,则通过主键索引访问表时,至少要读取两个数据块:一个索引块,另一个是表的数据块。
而如果通过IOT表,由于表的数据就存放在索引块中,所以只需要读取一个块即可。IOT表时虚拟表,但是他具有普通表所有的特性。
而且尽管IOT表的数据实际存放在索引segment里,但是我们还是可以在IOT表的基础上,在其他列上再次创建索引,这种索引我们叫二级索引。
使用二级索引查找数据时,存在以下两个阶段:
1,物理猜测:根据二级索引里记录的物理ROWID,去扫描其指向的IOT表所依附的索引segment里的索引节点。
2,逻辑猜测:由于IOT表的数据存放在索引的叶子节点里,而由于在索引里数据都是有序存放的,数据会子会在叶子节点中间插入,因此就存在向叶子节点的拆分问题。一旦叶子节点被拆分,数据所在的索引块就会变化,那么二级索引所指向的位置也就错误了。通过物理ROWID去访问IOT表就找不到数据。这个时候,Oracle会进行逻辑猜测,这时就不使用ROWID了,而是使用主键列的值去扫描IOT表。
创建IOT表