zoukankan      html  css  js  c++  java
  • [转]ORACLE中Like与Instr模糊查询性能大比拼

    instr(title,'手册')>0  相当于  title like '%手册%'

    instr(title,'手册')=1  相当于  title like '手册%'

    instr(title,'手册')=0  相当于  title not like '%手册%'

    t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数差别相当大。下面是一些测试结果:

    SQL> set timing on
    SQL> select count(*) from t where instr(title,'手册')>0;

      COUNT(*)
    ----------
         65881

    Elapsed: 00:00:11.04
    SQL> select count(*) from t where title like '%手册%';

      COUNT(*)
    ----------
         65881

    Elapsed: 00:00:31.47
    SQL> select count(*) from t where instr(title,'手册')=0;

      COUNT(*)
    ----------
      11554580

    Elapsed: 00:00:11.31
    SQL> select count(*) from t where title not like '%手册%';

      COUNT(*)
    ----------
      11554580

    另外,我在结另外一个2亿多的表,使用8个并行,使用like查询很久都不出来结果,但使用instr,4分钟即完成查找,性能是相当的好。这些小技巧用好,工作效率提高不少。通过上面的测试说明,ORACLE内建的一些函数,是经过相当程度的优化的。

    instr(title,’aaa’)>0 相当于like

    instr(title,’aaa’)=0 相当于not like

    特殊用法:

    select   id, name from users where instr('101914, 104703', id) > 0;
      它等价于
    select   id, name from users where id = 101914 or id = 104703;

    使用Oracle的instr函数与索引配合提高模糊查询的效率

    一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:
    1.select * from tb where name like '%XX%';
    2.select * from tb where instr(name,'XX')>0;

    若是在name字段上没有加索引,两者效率差不多,基本没有区别。

    为提高效率,我们在name字段上可以加上非唯一性索引:
    create index idx_tb_name on tb(name);

    这样,再使用

    select * from tb where instr(name,'XX')>0;

    这样的语句查询,效率可以提高不少,表数据量越大时两者差别越大。但也要顾及到name字段加上索引后DML语句会使索引数据重新排序的影响。

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/autumnlj/p/5754372.html
Copyright © 2011-2022 走看看