zoukankan      html  css  js  c++  java
  • 浅谈之用合适的索引来避免看似无法避免的全表扫描

    遇到这样一个问题:客户查询交易要求实现按照姓名实现模糊查询,单单在姓名简历索引不能解决问题,因为这种百分号在最前面的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的执行时间。

  • 相关阅读:
    6 Django的视图层
    5 Django-2的路由层(URLconf)
    4 Django简介
    3 web框架
    2 http协议
    1 web应用
    15-jQuery补充
    14-jQuery的ajax
    13-轮播实现(各种)
    12-事件委托(事件代理)
  • 原文地址:https://www.cnblogs.com/jwangpip/p/9115418.html
Copyright © 2011-2022 走看看