<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>碧海蓝天 &#187; sql</title>
	<atom:link href="http://wajoynece.cn/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://wajoynece.cn</link>
	<description>Oracle DataBase Linux Software</description>
	<lastBuildDate>Tue, 06 Sep 2011 08:26:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SQL优化之警惕死循环</title>
		<link>http://wajoynece.cn/2009/07/deadloop/</link>
		<comments>http://wajoynece.cn/2009/07/deadloop/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 08:13:57 +0000</pubDate>
		<dc:creator>wajoynece</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://wajoynece.cn/?p=124</guid>
		<description><![CDATA[昨天接到一个任务：一个报表相关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) := &#039;&#039; ; tempstr varchar2(2000) := &#039;&#039;; tempstr2 varchar2(2000) := &#039;&#039;; begin tempstr := &#039;&#039;; tempstr2 := &#039;&#039;; if (Src is not null) then begin tempstr := substr(Src,instr(Src,&#039;=&#039;)+1); loop if instr(tempstr,&#039;;&#039;)&#60;=0 then [...]]]></description>
			<content:encoded><![CDATA[<p>昨天接到一个任务：一个报表相关sql语句需要优化，原来执行时间几分钟，现在半小时也出不来。</p>
<p>登录系统后，查看sql语句执行计划未发现问题；</p>
<p>会话A中执行语句，A会话的状态为inactive，相关等待事件为SQL*Net message from client；</p>
<p>上面的现象比较怪异，值得怀疑；</p>
<p>进一步查看sql语句，发现select后面有部分列使用了自定义函数，试图去掉自定义函数相关字段，查询，很快正常返回结果；</p>
<p>到这里可以断定是函数导致的问题，经过进一步针对自定义函数以及表中相关列数据的排查，最后确定问题的原因：</p>
<p>对于表中一条特殊数据，自定义函数进入死循环，故sql语句长时间未返回。</p>
<p>问题函数，看看死循环在哪呢：</p>
<pre class="brush: sql; ">

create or replace function P_StringReplace(Src in varchar2) return varchar2 as
Result varchar2(2000) := &#039;&#039; ;
tempstr varchar2(2000) := &#039;&#039;;
tempstr2 varchar2(2000) := &#039;&#039;;
begin
tempstr := &#039;&#039;;
tempstr2 := &#039;&#039;;
if (Src is not null) then
begin
tempstr := substr(Src,instr(Src,&#039;=&#039;)+1);
loop
if instr(tempstr,&#039;;&#039;)&lt;=0 then
exit;
end if;
tempstr2 := substr(tempstr,instr(tempstr,&#039;;&#039;),instr(tempstr,&#039;=&#039;)-instr(tempstr,&#039;;&#039;)+1);
tempstr := replace(tempstr, tempstr2, &#039;/&#039;);
end loop;
Result := tempstr;
end;
else
begin
Result := &#039;无&#039;;
end;
end if;

return(Result);
end P_StringReplace;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://wajoynece.cn/2009/07/deadloop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

