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的执行时间。

  • 相关阅读:
    C++模板编译模型
    C++继承与构造函数、复制控制
    PHP判断用户是手机端?还是浏览器端访问?
    CentOS6.5搭建LNMP
    星级评分--封装成jquery插件
    扩展thinkphp5的redis类方法
    js实现星级评分之方法一
    js原型与继承
    一个基于Tp3.2(thinkphp3.2)的工会管理系统
    实验楼的php比赛题,网页数据提取。
  • 原文地址:https://www.cnblogs.com/jwangpip/p/9115418.html
Copyright © 2011-2022 走看看