首页 > Oracle > Oracle Global index和Local index的抉择!
2014
03-17

Oracle Global index和Local index的抉择!

全局索引和本地索引的区别这里我就不说了,网络上也有很多介绍这几种索引的区别,我这里说明一下在分区表中和普通表中,这2个索引的抉择。首先来说一下分区表,比如一个表按照日期分区,当where条件过滤的时候,需要通过这个分区键过滤数据,此时这里就要建立本地索引了,看下面个例子

这个sql也非常简单,我这里就不贴sql了,看到执行计划中的id=6这一步,global index回表,就可以tb_t_dv_w是一个分区表,并且是按照日期分区的,在谓词过滤的时候直接按照日期过滤一天的数据,但执行计划中还走的是全局索引扫描,这样整个索引都会扫描,其他没有用到的分区的索引都要扫描,在分区裁剪的时候,不能有效的提出大部分数据,导致回表的时候还要进行过滤操作。其实这个sql也是开发人员粗心,在分区表上建立索引的时候,直接建立了全局索引,并且没有注意到sql的过滤条件中有分区键过滤的情况,这样就会扫描整个全局索引了。

上面说了一个简单的local索引的使用场景,下面来看一下global索引的使用场景,也针对分区表,但是在where条件过滤的时候,分区键没有在过滤条件中,那这里就需要建立global索引了,原因是因为sql语句在过滤的时候,因为没有分区键作为过滤条件,会扫描过滤整个索引,如果建立本地索引,那每个索引块都是分开的,sql在过滤的时候会把整个本地索引都扫描,无疑会带来更大的逻辑读,更多的消耗。所以这种情况建立全局索引更适合,这里我就不贴例子实验了,道理也非常简单。在以后开发的时候注意这一点就行。

不过在大多数情况下,分区键一般都会包含在过滤条件当中,不过也有特殊的查询不会包含分区键,直接扫描整个表。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL