浅谈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个,索引扫是从根开始扫,只读书一个数据块,


1. B树索引
B树索引类似于倒置的树型结构,包括根节点、树枝节点和叶节点,使用树遍历算法搜索列值。

上图是B树索引的结构示意图,根节点和分支节点的结构类似,都包含指向下一层的指针及其键值范围,叶节点包含键值和行编号(RowID)。
B树索引适合于选择性较低(即键值重复率较低)的列,当键值重复率较高时,使用B树索引有时可能还不如用全表扫描,因为需要在索引和原表之间不断切换,对表进行过多的单数据块访问,产生额外的I/O。
2. 位图索引
和B树索引相反,位图索引适合键值重复率高的表,若重复值很低,则位图索引有可能非常大。由于位图索引采用0,1记录某行是否包含该键值,因此非常适合AND, OR, NOT,count等这样的逻辑操作。
位图索引非常不适合有大量“写”的操作,因为每一个位图键值中,都可能对于多条记录,当修改一条记录更新位图键值时,会在对应的位图索引键上加锁,从而导致对其它记录的修改也会被阻塞。
3. 全文索引
全文索引主要用于词汇的快速搜索,比较适合对列中的字段进行模糊查询(如SQL语句中包含%)或者语言类的查询,其缺点是占用空间太大(会创建很多中间表)




B树索引是一对一的,一个索引条目指向一行; 

位图索引   适用于   重复数据比较多的情况下使用;

位图索引适用于数据仓库环境,在记录查询方面性能要远远高于B树索引,但对于插入更新效率不好,适合记录查询大于插入更新的环境。
而位图索引中,所以条目非常少,每个条目指向多行,它适合一些特殊的环境; 
单纯的比较他们的性能是没法比较的,因为应用的环境不一样 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值