SQL优化之警惕死循环
昨天接到一个任务:一个报表相关sql语句需要优化,原来执行时间几分钟,现在半小时也出不来。
登录系统后,查看sql语句执行计划未发现问题;
会话A中执行语句,A会话的状态为inactive,相关等待事件为SQL*Net message from client;
上面的现象比较怪异,值得怀疑;
进一步查看sql语句,发现select后面有部分列使用了自定义函数,试图去掉自定义函数相关字段,查询,很快正常返回结果;
到这里可以断定是函数导致的问题,经过进一步针对自定义函数以及表中相关列数据的排查,最后确定问题的原因:
对于表中一条特殊数据,自定义函数进入死循环,故sql语句长时间未返回。
问题函数,看看死循环在哪呢:
create or replace function P_StringReplace(Src in varchar2) return varchar2 as Result varchar2(2000) := '' ; tempstr varchar2(2000) := ''; tempstr2 varchar2(2000) := ''; begin tempstr := ''; tempstr2 := ''; if (Src is not null) then begin tempstr := substr(Src,instr(Src,'=')+1); loop if instr(tempstr,';')<=0 then exit; end if; tempstr2 := substr(tempstr,instr(tempstr,';'),instr(tempstr,'=')-instr(tempstr,';')+1); tempstr := replace(tempstr, tempstr2, '/'); end loop; Result := tempstr; end; else begin Result := '无'; end; end if; return(Result); end P_StringReplace;