浅谈oracle索引

oracle索引一般分为B树索引和位图索引,用的比较多的都是B树索引。

 B树索引,比如普通索引,反转索引,降序索引,函数索引,这些索引都是B树索引,结构都是一样的,位图索引的存储结构和B树是不一样的,对于B树索引,可以进行一般的索引唯一扫描,索引范围扫描,快速索引扫描和索引全扫描,位图就简单很多,他只有全扫描,才能找到对应的行。顾名思义,B树索引其实就是一棵树,普通的都是升序,右边节点比左边的节点大,那么降序就是正好反之。B树的所有节点都在一条双向链上,就是用来实现范围扫秒用的。

 接下来,介绍一下反转索引,反转索引在存储键值的时候,先把键值反转,再进行存储,比如abcd就反转为dcba,一般反转索引用来解决热块,原理就是利用键值反转,把索引块打乱,把热点分散到不同的索引块。

记得创建的时候是用reverse函数:create index_name on tablename (reverse(ind_name));如过是 create index_name on tablename(ind_name) reverse;是用不到范围扫描的。

HW大家应该都清楚,如果是全表扫描,那么所有的数据块都会被扫一遍,HW以下的是肯定被扫的,以上的就不用了,以上的就相当于是没人住过的房子,不用去找。这里B树索引高度一般都是3,就是说扫描三个索引块就可以找到值,如果数据量大,那么可能就会高于3这个高度,B索引重要的几个概念,根节点,分支节点,叶子节点,很好理解,根肯定是最高的,分支就在中间,叶子在最底层,这里注意叶子节点,他除了有键值,还有块地址。

还有一点索引的使用绝对不能滥用,因为索引是有序的,所以在IO上会有很大消耗,如果一个表上很多索引,而且表的内容经常使用DML语句,那么索引肯定也是经常更新,会消耗额外的IO和CPU性能。还有一点一定要记得,创建好函数索引以后,一定要记得分析后再使用。至于反转索引,这里不详解了,可以dump出来看看,在reverse一下看看区别。很明显。

还有索引快速扫和索引扫是不一样的,快速只扫叶子节点,一次性读取db_file_multiblock_read_count个,索引扫是从根开始扫,只读书一个数据块。
你活着,证明了什么?