浅谈之用合适的索引来避免看似无法避免的全表扫描

遇到这样一个问题:客户查询交易要求实现按照姓名实现模糊查询,单单在姓名简历索引不能解决问题,因为这种百分号在最前面的like条件是没法走索引的,但是同时我们也知道对于有百分号的like条件,如果百分号在like条件的最后面,则这种情况下是可以走索引的。那么能不能实现在不改变上述sql含义的情况下把百分号从like条件的最前面移到最后面呢?使用reverse函数就可以做到这一点。

做个试验:

create table t1 as select * from dba_tables;

create index idx_t1 on t1(object_name);

alter system flush buffer_cache; //请勿在生产环境执行此语句

select object_name,object_id from t1 where object_name like '%EMP';

 

上图可得知,oracle在执行sql时没有用到索引,选择了全表扫描,读了1000多逻辑读。

下面开始转换思路:

create index idx_fun_t1 on t1(reverse(object_name));

alter system flush buffer_cache;

 

select object_name,object_id from t1 where reverse(object_name) like reverse('%EMP');

 

 

 

上面图片可以看到,用到了函数索引IDX_FUN_T1,这里的执行时间减少,考费的逻辑读和物理读也降到了不到30.大幅度的降低了目标sql语句的资源消耗,进而大幅缩短了目标sql的执行时间。

posted @ 2018-05-31 10:54  王洁  阅读(241)  评论(2编辑  收藏  举报