SQl模糊查询优化 具有天才的疯子称号的高手进
语句 如下 :
select s.hydwmc,
        s.slno,
        s.dkrq,
        s.ckmc,
        s.ckqw,
        decode(nvl(f.bzw, '0'), '3', '已出库', '2', '已预订', '在库') zt,
        s.jgryxm,
        f.flno,
        f.flrq,
        s.pc,
        s.jhdj,
        s.cjh,
        s.clhgz,
        s.fdjh,
        s.clys,
        s.scrq
   from (select a.hydwno,
                a.wddwno,
                b.wzno,
                a.slno,
                a.dkrq,
                b.ckqw,
                b.pc,
                b.cjh,
                b.clhgz,
                b.fdjh,
                b.clys,
                b.scrq,
                b.jhdj,
                (select hy.dwmc from hy_wldw hy where hy.dwno = a.hydwno) hydwmc,
                (select ck.ckmc
                   from ckbm ck
                  where ck.ckno = a.ckno
                    and ck.wddwno = a.wddwno) ckmc,
                (select wz.description
                   from wzbm wz
                  where wz.pinpai in
                        (select re.cpcode
                           from wzbm_hywldw_relation re
                          where re.hydwno = a.hydwno)
                    and wz.cpcode = b.wzno) wzmc,
                (select ry.jgryxm || ' ' || ry.sjdh
                   from jr_jgjl_jgry ry
                  where ry.hydwno = a.hydwno) jgryxm
           from ck_sldk a, ck_slmx b
          where a.slno = b.slno
            and ((instr (b.pc, '110126') > 0 ) or (instr (b.cjh, 'LJ12EKR10B4300274') > 0)))s,
        (select a.bzw,
                a.hydwno,
                a.wddwno,
                b.wzno,
                a.flno,
                a.flrq,
                b.ckqw,
                b.pc
           from ck_fldk a, ck_flmx b
          where a.flno = b.flno) f
  where s.pc = f.pc(+)
  order by s.hydwmc, s.pc, s.ckmc, s.ckqw, zt
------解决方案--------------------
1. 老问题了,要优化就不要使用in改写成exists
2. 估计楼主的重点在下面这句SQL上
and ((instr (b.pc, '110126') > 0 )))s,
这里得看你的子字符串在b.pc和b.cjh的位置,假设是b.pc和b.cjh的第1个字符开始的,那么可以优化。
为b.pc和b.cjh建立索引,然后使用下面的sql
and (b.pc like '110126%' or b.cjh like 'LJ12EKR10B4300274%'))s,
如果你的子字符串不在b.pc和b.cjh的开始位置,而是固定偏移的位置,也可以优化。
为b.pc和b.cjh建立两个函数索引,使用的sql同上。
如果你的子字符串在b.pc和b.cjh的位置不固定,那么这部分就没有办法优化了,只能走表的全检索。