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