select * from PBERP.ITEM WHERE FACT_NO='123' and partno='H2-21100462A9000'  
-- 1 second
SELECT ITEM.PARTNO,ITEM.DESCRIPT FROM pberp.ITEM  WHERE ITEM.FACT_NO='123' and item.partno like '%H2-21100462A9000%'
--20 secondselect * from pberp.item where ITEM.FACT_NO='123' and instr(item.partno ,'H2-21100462A9000')>0
--19 second
select count(*)from pberp.item--count=395742直接查询,不到1秒,两种方法模糊查询竟然要用20秒以上,找大仙看看有没有 什么办法让模糊查询快些,谢谢

解决方案 »

  1.   

    是本机数据库么?
    select * from PBERP.ITEM WHERE FACT_NO='123' and partno='H2-21100462A9000'   
    -- 1 second
     
    这个也要1秒么???  为何?我感觉30多万  不至于这么慢~ 
      

  2.   

    TOAD 在服务器查,20秒以上,客户机上的ERP查更慢,ERP只有30多个用户正在使用
      

  3.   

    用正则表达式 regexp_like 试试,如果还慢的话,就增加regexp_like 的函数索引,但是增加函数索引会增加oracle的维护开销,要根据你的情况自己考虑。
      

  4.   

    其他表的速度如何?   也是一样的慢么?在中午吃饭的时候  如果有机会  暂停一下AP Server   确保单用户查询一下  看看速度
      

  5.   

    很简单,like查询的情况下,索引是无效的,因此数据量大的情况下不能使用like模糊查询,你可以使用正则函数来完成这种功能,或者做一个数据拆分的查询。
    另外,如果一定要使用like查询,那么你需要使用线程分批查询,这样做的目的不是为了提高效率,而是为了分担负载。
      

  6.   

    select * from pberp.item where regexp_like(item.partno,'H2','i'); 
     
    出现运算无效,ORACLE 8.5I
      

  7.   

    oracle8.5 比较老了,估计支持的函数比较少把。
      

  8.   

    正则函数10G以上支持。
    SELECT ITEM.PARTNO,ITEM.DESCRIPT FROM pberp.ITEM WHERE ITEM.FACT_NO='123' and item.partno like '%H2-21100462A9000%'
    -->
    SELECT ITEM.PARTNO,ITEM.DESCRIPT FROM pberp.ITEM WHERE ITEM.FACT_NO='123' and item.partno like '%H2-21100462A9000'
      

  9.   

    感觉H2-21100462A9000就应该是一个完整的"partno",分析一下实际需求,是否真有必要用 LIKE,如果是因为前端查询传入的参数有空格什么的,直接就在前端处理掉空格或其它无效的字符,到SQL直接可以就用=号。
      

  10.   

    哥们,like只是字符串前面带有%才不走索引。
    另外一种情况,对索引字段用函数处理过了,也不会走索引,比如楼主第三条SQL中的:instr(item.partno ,'H2-21100462A9000')>0
    所以我想楼主这个表的索引字段应该是partNo。如果表很大,而必须对partno字段加前置的模糊查询,那就没办法优化了
      

  11.   

    如果用这个
    select * from pberp.item where ITEM.FACT_NO='123' and instr(item.partno ,'H2-21100462A9000')>0
    建立FACT_NO,partno索引试试,instr应该走这个索引的其实最好不用like查询
      

  12.   

    SELECT ITEM.PARTNO,ITEM.DESCRIPT FROM pberp.ITEM WHERE ITEM.FACT_NO='123' and item.partno like '%H2-21100462A9000%'
    这样查询的话,数据每次都要硬解析一遍,。
    试试  execute immediate
         'SELECT ITEM.PARTNO,ITEM.DESCRIPT FROM pberp.ITEM WHERE ITEM.FACT_NO=:1 and  instr(item.partno,:2)>0 '
    using '123','H2-21100462A9000';
      

  13.   

    1, 建立FACT_NO,partno 索引
    2, 用 LIKE 'H2-21100462A9000%'