日期:2014-05-16  浏览次数:20876 次

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的位置不固定,那么这部分就没有办法优化了,只能走表的全检索。