<?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; tuning</title>
	<atom:link href="http://wajoynece.cn/tag/tuning/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优化之过长的in list和过多的or操作</title>
		<link>http://wajoynece.cn/2009/08/sql%e4%bc%98%e5%8c%96%e4%b9%8b%e8%bf%87%e9%95%bf%e7%9a%84in-list%e5%92%8c%e8%bf%87%e5%a4%9a%e7%9a%84or%e6%93%8d%e4%bd%9c/</link>
		<comments>http://wajoynece.cn/2009/08/sql%e4%bc%98%e5%8c%96%e4%b9%8b%e8%bf%87%e9%95%bf%e7%9a%84in-list%e5%92%8c%e8%bf%87%e5%a4%9a%e7%9a%84or%e6%93%8d%e4%bd%9c/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 03:41:45 +0000</pubDate>
		<dc:creator>wajoynece</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://wajoynece.cn/2009/08/sql%e4%bc%98%e5%8c%96%e4%b9%8b%e8%bf%87%e9%95%bf%e7%9a%84in-list%e5%92%8c%e8%bf%87%e5%a4%9a%e7%9a%84or%e6%93%8d%e4%bd%9c/</guid>
		<description><![CDATA[CBO面对in (1,2,3,……)或者类似的or操作会做些什么呢？ 1. 把in转换为union all操作，从而用到索引加快查询，可以使用use_concat提示强制该转换，这么做的缺点在于CBO面对每个union all操作都要计算cost，导致parse时间过长，解决办法见2； 2. 对应的操作为inlist iterator，可以使用NO_EXPAND提示强制进行，即使用了索引，同时避免了union all带来的cost计算问题； 还有一个从设计角度优化这个问题的思路：就是建表保存in数据，用join代替in操作。]]></description>
			<content:encoded><![CDATA[<p>CBO面对in (1,2,3,……)或者类似的or操作会做些什么呢？<br />
1. 把in转换为union all操作，从而用到索引加快查询，可以使用use_concat提示强制该转换，这么做的缺点在于CBO面对每个union all操作都要计算cost，导致parse时间过长，解决办法见2；<br />
2. 对应的操作为inlist iterator，可以使用NO_EXPAND提示强制进行，即使用了索引，同时避免了union all带来的cost计算问题；</p>
<p>还有一个从设计角度优化这个问题的思路：就是建表保存in数据，用join代替in操作。</p>
]]></content:encoded>
			<wfw:commentRss>http://wajoynece.cn/2009/08/sql%e4%bc%98%e5%8c%96%e4%b9%8b%e8%bf%87%e9%95%bf%e7%9a%84in-list%e5%92%8c%e8%bf%87%e5%a4%9a%e7%9a%84or%e6%93%8d%e4%bd%9c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SQL优化之checkpoint not complete</title>
		<link>http://wajoynece.cn/2009/07/checkpointnotcomplete/</link>
		<comments>http://wajoynece.cn/2009/07/checkpointnotcomplete/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 05:42:32 +0000</pubDate>
		<dc:creator>wajoynece</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://wajoynece.cn/?p=131</guid>
		<description><![CDATA[话说从前有一个从excel导入到数据库中的功能，近来该功能“超级”缓慢，严重影响生产活动。 从告警日志中，可以找到一些线索：日志切换非常频繁，出现多处checkpoint not complete。 同时，在系统中查询产生redo最多的会话，正是上面提到的那个功能，导入不到1w条数据，竟然累计产生近10G的redo！！！ 到这里，已经有理由怀疑是这个功能出现的问题，导致过多的redo，进一步产生checkpoint not complete等待； OK，10046，终于找到了问题的根源：不合理使用的物化视图 在导入功能相关的数据库表上，建有一个物化视图，我们知道物化视图刷新可以on commit,on demand，而这里使用了on commit，而且每次都是全刷新；更糟糕的是，导入功能是每条记录提交一次！ 也就是说：每导入一条数据，物化视图需要清空，重新刷新数据。 解决思路： 物化视图刷新模式修改为on demand 物化视图全刷新变为快速刷新 导入数据使用分批提交方式]]></description>
			<content:encoded><![CDATA[<p>话说从前有一个从excel导入到数据库中的功能，近来该功能“超级”缓慢，严重影响生产活动。</p>
<p>从告警日志中，可以找到一些线索：日志切换非常频繁，出现多处checkpoint not complete。</p>
<p>同时，在系统中查询产生redo最多的会话，正是上面提到的那个功能，导入不到1w条数据，竟然累计产生近10G的redo！！！</p>
<p>到这里，已经有理由怀疑是这个功能出现的问题，导致过多的redo，进一步产生checkpoint not complete等待；</p>
<p>OK，<strong>10046</strong>，终于找到了问题的根源：<strong>不合理使用的物化视图</strong></p>
<p>在导入功能相关的数据库表上，建有一个物化视图，我们知道物化视图刷新可以on commit,on demand，而这里使用了on commit，而且每次都是全刷新；更糟糕的是，导入功能是每条记录提交一次！</p>
<p>也就是说：每导入一条数据，物化视图需要清空，重新刷新数据。</p>
<p>解决思路：</p>
<ul>
<li>物化视图刷新模式修改为on demand</li>
<li>物化视图全刷新变为快速刷新</li>
<li>导入数据使用分批提交方式</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wajoynece.cn/2009/07/checkpointnotcomplete/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<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>

