在向大家详细介绍Oracle B树索引之前,首先让大家了解下非唯一索引中,然后全面介绍Oracle B树索引。Oracle B树索引中不存在非唯一的条目。
在非唯一索引中,Oracle会把rowid作为一个额外的列追加到键上,使得键唯一。
Exp:create index I on T( x , y ) ,从概念上讲就是Create unique index I on T(x , y , rowid)。Oracle会首先按索引键值排序,然后再按照rowid升序排序。
在唯一索引中,数据只按索引键值排序。
1.大多数情况下,Oracle B树索引的高度都是2或者3,所以一般情况下,在索引中找到一个键只需要2或3次I/O。
2.Oracle B树索引所有叶子块都应该在同一层上,并且叶子节点实际上都是双向链表,这样在进行索引区间扫描(index range scan)的时候,只需通过叶子节点的向前或者向后就可以了,无需再对索引结构进行导航。
3.适当对Oracle B树索引存在重复值的列进行压缩, 可以增加缓存命中率,使I/O数减少,因为 相关的条目可能都存在在一个块中。(Exp:create index I on T(userid , username) username=’steven’这个值可能就会对应于多个rowid放在同一个索引块中);但是带来的负面作用是使索引结构复杂化,维护索引更耗时,查询索引占用CPU更多的时间。(压缩适合用于多列索引中)
4.Oracle B树索引的反向键索引主要用于缓解索引右侧缓冲区忙等待。适合用于类似于sequence产生的PK主键上,因为这些列不太会需要使用区间扫描,也就是不会用到max(PK),min(PK),between and或者where PK < 200等查询
5.如果在查询中会有order by colum1 asc,column2 desc, 试着在创建索引时create index I on T(colum1 asc,column2 desc) , 因为Oracle INDEX默认是DESC排序,在索引中排序总比在磁盘中排序好得多。
6.适合Oracle B树索引使用的2种情况: 1)访问表中占很小比例的行 2)根本不访问表,所需查询的数据全部在索引中 3)一种特殊的用法,使用索引访问表的全部行,这样的做法是为了使查询最初的响应时间很短,不是针对总吞吐量进行的优化。
7.索引是按索引键顺序存储,索引会按键的有序顺序进行访问。索引指向的块则随机存储在堆中。
8.建议:在thin表中使用Oracle B树索引查询<2-3%的列,fat表中<20-25%的列。