当前位置: 代码迷 >> Oracle技术 >> 复杂SQL语句优化提速,该怎么解决
  详细解决方案

复杂SQL语句优化提速,该怎么解决

热度:111   发布时间:2016-04-24 08:29:50.0
复杂SQL语句优化提速
SQL code
select (select bmdm_name from businessAreaConcentrade  where bmdm = d.companyid) companyid,to_char(d.endorOverDate,'yyyy-mm') year_month,s.scaleofmarkdes,count(distinct d.claimno) countnumfrom (  select claimno,  substr(','||tt.CHECKSCALEOFMARK,  instr(','||tt.CHECKSCALEOFMARK,',',1,temp.rn)+1,instr(tt.CHECKSCALEOFMARK,',',1,temp.rn)  -instr(','||tt.CHECKSCALEOFMARK,',',1,temp.rn)) CHECKSCALEOFMARK,  checkdate,ENDORSCALEOFMARK,ENDORDATEfrom claimScaleOfmarks tt,  (select rownum rn from dual connect by rownum<35)tempwhere length(tt.CHECKSCALEOFMARK)-length(replace(tt.CHECKSCALEOFMARK,','))>=temp.rn --order by 1,temp.rn) c,scaleOfmarksPara s,claiminfo  dwhere c.claimno=d.claimno  and c.checkScaleOfmark=s.id and (trunc(d.endorOverDate,'DD') >= to_date('2012-01-01','yyyy/mm/dd') and trunc(d.endorOverDate,'DD') <= to_date('2012-05-02','yyyy/mm/dd') )and (c.checkScaleOfmark is not null) or (c.endorScaleOfmark is not null)and s.score<=0group by d.companyid,to_char(d.endorOverDate,'yyyy-mm'),s.scaleofmarkdesorder by d.companyid,to_char(d.endorOverDate,'yyyy-mm'),s.scaleofmarkdes

上面语句执行比较慢,好像是慢在表连接。。各位大侠看看有没有可以优化的

------解决方案--------------------
(c.checkScaleOfmark is not null) or (c.endorScaleOfmark is not null)
这个应该挺影响速度的,如果这个2个字段有索引的话还是把or替换为union

companyid,endorOverDate,scaleofmarkdes尝试在这3个字段上建立组合索引

参考资料:
http://wenku.baidu.com/view/c631bd6327d3240c8447ef4e.html
http://blog.itpub.net/post/43362/523249
  相关解决方案