Archive

Posts Tagged ‘sql’

SQL优化之警惕死循环

July 22nd, 2009 wajoynece No comments

昨天接到一个任务:一个报表相关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;
Categories: Oracle Tags: ,