<?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>GlobStudio &#187; 数据库</title>
	<atom:link href="http://blog.globstudio.com/tag/%e6%95%b0%e6%8d%ae%e5%ba%93/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.globstudio.com</link>
	<description>记录成长历程，专注软件开发</description>
	<lastBuildDate>Wed, 14 Dec 2011 07:53:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>oracle锁表查询及解锁kill进程</title>
		<link>http://blog.globstudio.com/902.html</link>
		<comments>http://blog.globstudio.com/902.html#comments</comments>
		<pubDate>Tue, 09 Aug 2011 05:51:51 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=902</guid>
		<description><![CDATA[select count(*) from v$locked_object; select * from v$locked_object; &#8211;查看哪个表被锁 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; &#8211;查看是哪个session引起的 select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time; &#8211;杀掉对应进程 alter system kill session&#8217;1025,41&#8242;; &#8211;1025为sid,41为serial# &#160; 转自：http://jinyumantang110.blog.163.com/blog/static/54579156201141272633337/]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>
<h3><span class="Apple-style-span" style="font-size: 13px; font-weight: normal;">select count(*) from v$locked_object;</span></h3>
</div>
</div>
</div>
<div>
<p>select * from v$locked_object;</p>
<p>&#8211;查看哪个表被锁<br />
select b.owner,b.object_name,a.session_id,a.locked_mode<br />
from v$locked_object a,dba_objects b<br />
where b.object_id = a.object_id;</p>
<p><span id="more-902"></span><br />
&#8211;查看是哪个session引起的<br />
select b.username,b.sid,b.serial#,logon_time<br />
from v$locked_object a,v$session b<br />
where a.session_id = b.sid order by b.logon_time;<br />
&#8211;杀掉对应进程</p>
<p>alter system kill session&#8217;1025,41&#8242;;</p>
<p>&#8211;1025为sid,41为serial#</p>
<p>&nbsp;</p>
<p>转自：<a href="http://jinyumantang110.blog.163.com/blog/static/54579156201141272633337/">http://jinyumantang110.blog.163.com/blog/static/54579156201141272633337/</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/902.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OTL常见问题</title>
		<link>http://blog.globstudio.com/888.html</link>
		<comments>http://blog.globstudio.com/888.html#comments</comments>
		<pubDate>Thu, 16 Jun 2011 06:08:05 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[Linux开发]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[OTL]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=888</guid>
		<description><![CDATA[Oracle, Odbc and DB2-CLI Template Library, Version 4.0 Frequently Asked Questions Please, send your questions and comments to skuchin@ispwest.com, skuchin@gmail.com Q. OTL: how does OTL handle NULLs? Call otl_stream::is_null() to check whether the value that was just read from the stream is NULL or not. Use template class otl_value&#60;T&#62;. If there is a need to set the output [...]]]></description>
			<content:encoded><![CDATA[<ul>
<h1>Oracle, Odbc and DB2-CLI Template Library, Version 4.0</h1>
<h1>Frequently Asked Questions</h1>
</ul>
<p>Please, send your questions and comments to <a href="mailto:skuchin@ispwest.com">skuchin@ispwest.com</a>, <a href="mailto:skuchin@gmail.com">skuchin@gmail.com</a><br />
<em><span style="font-size: xx-small;"><br />
</span></em><em><span style="font-size: xx-small;">Q. OTL: how does OTL handle NULLs?</span></em></p>
<ul>
<li>Call otl_stream::<a href="http://otl.sourceforge.net/otl3_stream_class.htm#is_null">is_null</a>() to check whether the value that was just read from the stream is NULL or not.</li>
<li>Use template class <a href="http://otl.sourceforge.net/otl3_value.htm">otl_value</a>&lt;T&gt;.</li>
<li>If there is a need to set the output variable to a value when NULL is fetched (by default, OTL does not set the output byffer to any value in the case of NULL), the following #defines could be enabled:
<ul>
<li><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_DEFAULT_NUMERIC_NULL_TO_VAL">OTL_DEFAULT_NUMERIC_NULL_TO_VAL</a></li>
<li><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_DEFAULT_DATETIME_NULL_TO_VAL">OTL_DEFAULT_DATETIME_NULL_TO_VAL</a></li>
<li><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_DEFAULT_STRING_NULL_TO_VAL">OTL_DEFAULT_STRING_NULL_TO_VAL</a></li>
<li><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_DEFAULT_CHAR_NULL_TO_VAL">OTL_DEFAULT_CHAR_NULL_TO_VAL</a></li>
<li><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL">OTL_USER_DEFINED_STRING_CLASS_DEFAULT_NULL_TO_VAL</a></li>
</ul>
</li>
</ul>
<p><em><span style="font-size: xx-small;">Q. OTL: is it thread safe?</span></em></p>
<p><span id="more-888"></span></p>
<p>OTL does not set any mutex locks or critical sections. In case if each thread has its own otl_connect object, there is no need for mutex locks. In case of sharable connections, it is the devloper&#8217;s responsibility to wrap up OTL calls with mutexes. In general, database APIs do not guarantee thread safety. otl_connect::<a href="http://otl.sourceforge.net/otl3_connect_class.htm#otl_initialize">otl_initialize</a> passes a flag to the underlying database API only to let the API know that the progam is running in a multi-threaded mode.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it work with SQLite?</span></em></p>
<p>Yes, it does. OTL/ODBC works with SQLite. See the following <a href="http://otl.sourceforge.net/otl4_sqlite_examples.htm">examples</a> for detail.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it support Oracle 10g?</span></em></p>
<p>The answer is Yes. Use #define <a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_ORA10G">OTL_ORA10G</a>, <a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_ORA10G_R2">OTL_ORA10G</a><a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_ORA10G_R2">_R2</a></p>
<p>&nbsp;</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it work with SAP DB?</span></em></p>
<p>Yes, it does. OTL/ODBC works with SAP DB. Fore more detail, see OTL <a href="http://otl.sourceforge.net/otl4_sap_db_examples.htm">examples</a> for SAP DB.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it support CLOBs/BLOBs in PL/SQL?</span></em></p>
<p>The answer is: it depends. You need to keep in mind that “CLOB/BLOB” as a PL/SQL datatype is a <em>locator</em> of a large object, not a value. That is, the object itself needs to be created first, its locator needs to be retrieved from the database into C++, and only then the locator can be passed into PL/SQL. Also, see code example <a href="http://otl.sourceforge.net/otl4_ex378.htm">378</a>.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it support Unicode?</span></em></p>
<p>The answer is Yes. See OTL examples and the manual.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: does it support Oracle 9i?</span></em></p>
<p>The answer is Yes. Starting with version 4.0.0, OTL introduces #define <a href="http://otl.sourceforge.net/otl3_compile.htm#OTLORA9I">OTL_ORA9I</a> that is dedicated to Oracle 9i. In OTL 4.0.0 itself, it&#8217;s not much more than a synonym for OTL_ORA8I, but in subsequent releases, when OTL starts using OCI9 specific features, only OTL_ORA9I should be used. See “<a href="http://otl.sourceforge.net/otl3_whatn.htm#NEW_OTL400">what&#8217;s new in OTL 4</a>” for more detail.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: can it work with Interbase 6.x?</span></em></p>
<p>The answer is Yes. Starting with version 4.0.0, OTL supports an Open Source ODBC driver for Interbase. See “<a href="http://otl.sourceforge.net/otl3_whatn.htm#NEW_OTL400">what&#8217;s new in OTL 4</a>” for more detail.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: can it work with PostgreSQL 7.x?</span></em></p>
<p>The answer is Yes. Starting with version 4.0.0, OTL supports PostgreSQL via ODBC. See “<a href="http://otl.sourceforge.net/otl3_whatn.htm#NEW_OTL400">what&#8217;s new in OTL 4</a>” for more detail.</p>
<p><em><span style="font-size: xx-small;">Q. OTL: can it work with DB2, Call Level Interface (CLI)?</span></em></p>
<p>The answer is Yes. Starting with version 3.2.7, there is a new flavor of OTL: OTL/DB2-CLI. OTL/DB2-CLI uses DB2&#8242;s native database API: the <em>Call Level Interface.</em> DB2-CLI is 99.5% compatible with the ODBC 3.x specification, plus extensions. The OTL header file #includes CLI&#8217;s native header files and can be used with DB2-CLI&#8217;s native object libraries in Windows or Unix (primarily AIX) platforms.</p>
<p><em><span style="font-size: xx-small;">Q. OTL/ODBC: can it work with MyODBC/MySQL?</span></em></p>
<p>The answer is Yes. Starting with version 3.2.4, OTL/ODBC is compatible with MyODBC, and the following #define was introduced to do just that: #define <a href="http://otl.sourceforge.net/otl3_compile.htm#OTL_ODBC_MYSQL">OTL_ODBC_MYSQL</a>. For more detail see also <a href="http://otl.sourceforge.net/otl3_examples.htm#MYODBC">MyODBC for MySQL</a>The new #define turns off transactional ODBC function calls, since MySQL does not support transactions [yet].</p>
<p><em><span style="font-size: xx-small;">Q. OTL/OCI8 and XA-connectivity: can they work together?</span></em></p>
<p>The answer is Yes. When an XA type connection is established, xaoEnv() and xaoSvcCtx() functions need to be invoked in order to get OCI8 compatible environment and service context handles. After that, otl_connect::<a href="http://otl.sourceforge.net/otl3_connect_class.htm#attach8">rlogon</a>() can be called to create an OTL connection from the handles. It is the same rlogon() that is used with Pro*C 8.x. How to use this type of rlogon() function, see example <a href="http://otl.sourceforge.net/otl3_ex59.htm">59</a> for more detail.</p>
<p><em><span style="font-size: xx-small;">Q. Are C++ strings (std::string) supported, and how is OTL integrated with the Standard Template Library (STL)?</span></em></p>
<p>OTL 3.2.0 and higher support <em>std::strings</em> (see examples <a href="http://otl.sourceforge.net/otl3_ex72.htm">72</a>, <a href="http://otl.sourceforge.net/otl3_ex73.htm">73</a>, <a href="http://otl.sourceforge.net/otl3_ex74.htm">74</a>). Also, OTL supports STL-compliant stream iterators: <a href="http://otl.sourceforge.net/otl3_input_iterator.htm">otl_input_iterator</a>, <a href="http://otl.sourceforge.net/otl3_output_iterator.htm">otl_output_iterator</a>.</p>
<p><em><span style="font-size: xx-small;">Q. What major C++ compilers are supported, anyway?</span></em></p>
<ul>
<li>Sun C++ Workshop 5.x/6.0, Forte C++ (Sun C++ WS 6.1 and higher)</li>
<li>GNU C++ 2.9x.x, 3.0.x, 3.1.x, 3.2.x., 3.3.x, 3.4.x, 4.0.x</li>
<li>VC++ 6.0, VC++ 7.1, VC++ 8.0</li>
<li>HP ANSI C++ (aCC) 1.x</li>
<li>AIX, xlC 4.x and higher</li>
<li>C++ in OSF Alfa Unix and Oracle 7.3.4</li>
<li>Borland C++ 5.x</li>
<li>KAI C++ 3.x and higher (multi-platform)</li>
<li>Intel C++ 7.0, 8.0 (Windows, Linux)</li>
</ul>
<p>In order to complete the list, you are welcome to send me an email with the name of your C++ compiler, if it&#8217;s not already in the list.</p>
<p><em><span style="font-size: xx-small;">Q. Is there a way to read / write large BLOBs without having to allocate large buffers in memory?</span></em></p>
<p>OTL 3.1.4 supports <a href="http://otl.sourceforge.net/otl3_lob_stream.htm">stream mode</a> for Oracle 8 CLOBs/BLOBs. Fore more detail, see examples <a href="http://otl.sourceforge.net/otl3_ex56.htm">56</a>, <a href="http://otl.sourceforge.net/otl3_ex57.htm">57.</a></p>
<p><em><span style="font-size: xx-small;">Q. Is there a way to call a stored procedure which takes PL/SQL tables as arguments ?</span></em></p>
<p>OTL 3.1 supports PL/SQL table via <a href="http://otl.sourceforge.net/otl3_bind_variables.htm#pl_tab">otl_streams</a> and <a href="http://otl.sourceforge.net/otl3_pl_tab.htm">special template data containers</a>.Fore more detail, see examples <a href="http://otl.sourceforge.net/otl3_ex49.htm">49</a>, <a href="http://otl.sourceforge.net/otl3_ex50.htm">50</a>, <a href="http://otl.sourceforge.net/otl3_ex51.htm">51</a>, <a href="http://otl.sourceforge.net/otl3_ex52.htm">52</a>.</p>
<p><em><span style="font-size: xx-small;">Q. Will you stick with email delivery of your code, or do you intend to put it on your website later ?</span></em></p>
<p>From now on, the OTL header file is available for <a href="http://otl.sourceforge.net/otlv4_h.zip">download</a>.</p>
<p><em><span style="font-size: xx-small;">Q. What is different in behavior of Large Objects (LOBs) compared to other datatypes as far as NULLs are concerned?</span></em></p>
<p>For more detail, see “<a href="http://otl.sourceforge.net/otl3_long_string.htm#LOB_and_NULL">Large Objects and NULLs</a>.”</p>
<p><em><span style="font-size: xx-small;">Q. How to read/write date&amp;time informarion from/to the <a href="http://otl.sourceforge.net/otl3_stream_class.htm">otl_stream</a>?</span></em></p>
<p>The answer is: use the <a href="http://otl.sourceforge.net/otl3_stream_class.htm#otl_datetime">otl_datetime</a> data container, which was introduced in OTL 3.1.26. For more detail, se examples <a href="http://otl.sourceforge.net/otl3_ex38.htm">38</a>, <a href="http://otl.sourceforge.net/otl3_ex39.htm">39</a>, <a href="http://otl.sourceforge.net/otl3_ex40.htm">40</a>.<br />
Bottom line: Oracle DATE, or, say, MS SQL Server DATETIME, can be read/written with the use of otl_datetime variables.</p>
<p><em><span style="font-size: xx-small;">Q. How to get the <strong>rows processed count</strong> after the SQL statement is finished?</span></em></p>
<p>The <a href="http://otl.sourceforge.net/otl3_const_sql.htm">direct_exec</a>() function returns a long int value, which, if it is &gt;= 0, it retunrs the rows processed count of the constant SQL statement.Also, otl_stream::<a href="http://otl.sourceforge.net/otl3_stream_class.htm#get_rpc">get_rpc</a>() returns a long int value, which is the rows processed count. The rows processed count is defined for INSERT, UPDATE, and DELETE statements. For any other SQL statement, PL/SQL block, or a stored procedure call, the count is always 0.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/888.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转】Oracle数据库提高命中率及相关优化</title>
		<link>http://blog.globstudio.com/759.html</link>
		<comments>http://blog.globstudio.com/759.html#comments</comments>
		<pubDate>Fri, 23 Apr 2010 02:05:44 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=759</guid>
		<description><![CDATA[关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL&#62;SELECT SUM(pinhits)/sum(pins) FROM V$LIBRARYCACHE; 通常在98%以上，否则，需要要考虑加大共享池，绑定变量，修改cursor_sharing等参数。 2)计算共享池内存使用率: SQL&#62;SELECT (1 - ROUND(BYTES / (&#38;TSP_IN_M * 1024 * 1024), 2)) * 100 &#124;&#124; '%' FROM V$SGASTAT WHERE NAME = 'free memory' AND POOL = 'shared pool'; 其中: &#38;TSP_IN_M是你的总的共享池的SIZE(M) 共享池内存使用率，应该稳定在75%-90%间，太小浪费内存，太大则内存不足。 查询空闲的共享池内存: SQL&#62;SELECT * FROM V$SGASTAT WHERE NAME = 'free memory' AND POOL = 'shared pool'; 3)db buffer cache命中率: 计算公式:Hit ratio = 1 &#8211; [physical reads/(block gets + consistent gets)] SQL&#62;SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS, 1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio" FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT'; 通常应在90%以上，否则，需要调整,加大DB_CACHE_SIZE 另外一种计算命中率的方法(摘自ORACLE官方文档&#60;&#60;数据库性能优化&#62;&#62;): 命中率的计算公式为: Hit Ratio = 1 - ((physical reads - physical reads direct - physical reads direct (lob)) / (db block gets + consistent gets - physical reads direct - physical reads direct (lob)) 分别代入上一查询中的结果值,就得出了Buffer cache的命中率 SQL&#62;SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME IN('session logical reads', 'physical reads', 'physical reads direct', 'physical reads direct (lob)', [...]]]></description>
			<content:encoded><![CDATA[<p>关于Oracle中各个命中率的计算以及相关的调优</p>
<p><strong>1)Library Cache的命中率:</strong></p>
<p>.计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins)</p>
<pre>
<ol>
<li>SQL&gt;SELECT SUM(pinhits)/sum(pins)</li>
<li>FROM V$LIBRARYCACHE;</li>
</ol>
</pre>
<p>通常在98%以上，否则，需要要考虑加大共享池，绑定变量，修改cursor_sharing等参数。<br />
<span id="more-759"></span><br />
<strong>2)计算共享池内存使用率:</strong></p>
<pre>
<ol>
<li>SQL&gt;SELECT (1 - ROUND(BYTES / (&amp;TSP_IN_M * 1024 * 1024), 2)) * 100 || '%'</li>
<li>FROM V$SGASTAT</li>
<li>WHERE NAME = 'free memory' AND POOL = 'shared pool';</li>
</ol>
</pre>
<p>其中: &amp;TSP_IN_M是你的总的共享池的SIZE(M)</p>
<p>共享池内存使用率，应该稳定在75%-90%间，太小浪费内存，太大则内存不足。</p>
<p>查询空闲的共享池内存:</p>
<pre>
<ol>
<li>SQL&gt;SELECT * FROM V$SGASTAT</li>
<li>WHERE NAME = 'free memory' AND POOL = 'shared pool';</li>
</ol>
</pre>
<p><strong>3)db buffer cache命中率:</strong></p>
<p>计算公式:Hit ratio = 1 &#8211; [physical reads/(block gets + consistent gets)]</p>
<pre>
<ol>
<li>SQL&gt;SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,</li>
<li>1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"</li>
<li>FROM V$BUFFER_POOL_STATISTICS</li>
<li>WHERE NAME='DEFAULT';</li>
</ol>
</pre>
<p>通常应在90%以上，否则，需要调整,加大DB_CACHE_SIZE</p>
<p>另外一种计算命中率的方法(摘自ORACLE官方文档&lt;&lt;数据库性能优化&gt;&gt;):</p>
<p>命中率的计算公式为:</p>
<pre>
<ol>
<li>Hit Ratio = 1 - ((physical reads - physical reads direct - physical reads direct (lob)) / (db block gets +</li>
<li>consistent gets - physical reads direct - physical reads direct (lob))</li>
</ol>
</pre>
<p>分别代入上一查询中的结果值,就得出了Buffer cache的命中率</p>
<pre>
<ol>
<li>SQL&gt;SELECT NAME, VALUE</li>
<li>FROM V$SYSSTAT</li>
<li>WHERE NAME IN('session logical reads',</li>
<li>'physical reads',</li>
<li>'physical reads direct',</li>
<li>'physical reads direct (lob)',</li>
<li>'db block gets', 'consistent gets');</li>
</ol>
</pre>
<p><strong>4)数据缓冲区命中率：</strong></p>
<pre>
<ol>
<li>SQL&gt; select value from v$sysstat where name ='physical reads';</li>
<li>SQL&gt; select value from v$sysstat where name ='physical reads direct';</li>
<li>SQL&gt; select value from v$sysstat where name ='physical reads direct (lob)';</li>
<li>SQL&gt; select value from v$sysstat where name ='consistent gets';</li>
<li>SQL&gt; select value from v$sysstat where name = 'db block gets';</li>
</ol>
</pre>
<p>这里命中率的计算应该是</p>
<p>令 x = physical reads direct + physical reads direct (lob)</p>
<p>命中率 =100 &#8211; ( physical reads &#8211; x) / (consistent gets + db block gets &#8211; x)*100</p>
<p>通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区</p>
<p><strong>5)共享池的命中率：</strong></p>
<pre>
<ol>
<li>SQL&gt; select sum(pinhits-reloads)/sum(pins)*100 "hit radio" from v$librarycache;</li>
</ol>
</pre>
<p>假如共享池的命中率低于95%,就要考虑调整应用（通常是没使用bind var ）或者增加内存</p>
<p><strong>6)计算在内存中排序的比率:</strong></p>
<pre>
<ol>
<li>SQL&gt;SELECT * FROM v$sysstat t WHERE NAME='sorts (memory)';—查询内存排序数</li>
<li>SQL&gt;SELECT * FROM v$sysstat t WHERE NAME='sorts (disk)';—查询磁盘排序数</li>
<li>--caculate sort in memory ratio</li>
<li>SQL&gt;SELECT round(&amp;sort_in_memory/(&amp;sort_in_memory+&amp;sort_in_disk),4)*100||'%' FROM dual;</li>
</ol>
</pre>
<p>此比率越大越好,太小整要考虑调整,加大PGA</p>
<p><strong>7)PGA的命中率:</strong></p>
<p>计算公式:BP x 100 / (BP + EBP)</p>
<p>BP: bytes processed</p>
<p>EBP: extra bytes read/written</p>
<pre>
<ol>
<li>SQL&gt;SELECT * FROM V$PGASTAT  WHERE NAME='cache hit percentage';</li>
</ol>
</pre>
<p>或者从OEM的图形界面中查看</p>
<p>我们可以查看一个视图以获取Oracle的建议值:</p>
<pre>
<ol>
<li>SQL&gt;SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,</li>
<li>ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,</li>
<li>ESTD_OVERALLOC_COUNT</li>
<li>FROM V$PGA_TARGET_ADVICE;</li>
<li>The output of this query might look like the following:</li>
<li>TARGET_MB  CACHE_HIT_PERC  ESTD_OVERALLOC_COUNT</li>
<li>----------           --------------        --------------------</li>
<li>   63              23                   367</li>
<li>  125              24                    30</li>
<li>  250              30                     3</li>
<li>  375              39                     0</li>
<li>  500              58                     0</li>
<li>  600              59                     0</li>
<li>  700              59                     0</li>
<li>  800              60                     0</li>
<li>  900              60                     0</li>
</ol>
</pre>
<p>在此例中:PGA至少要分配375M</p>
<p>我个人认为PGA命中率不应该低于50%</p>
<p>以下的SQL统计sql语句执行在三种模式的次数: optimal memory size, one-pass memory size, multi-pass memory size:</p>
<pre>
<ol>
<li>SQL&gt;SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total,4)) percentage</li>
<li>FROM (SELECT name, value cnt, (sum(value) over ()) total FROM V$SYSSTAT WHERE name like 'workarea exec%');</li>
</ol>
</pre>
<p><strong>8)共享区字典缓存区命中率</strong></p>
<p>计算公式：SUM(gets &#8211; getmisses &#8211; usage -fixed) / SUM(gets)</p>
<p>命中率应大于0.85</p>
<pre>
<ol>
<li>SQL&gt;select sum(gets-getmisses-usage-fixed)/sum(gets)</li>
<li>from v$rowcache;</li>
</ol>
</pre>
<p><strong>9)数据高速缓存区命中率</strong></p>
<p>计算公式：1-(physical reads / (db block gets + consistent gets))</p>
<p>命中率应大于0.90最好</p>
<pre>
<ol>
<li>SQL&gt;select name,value</li>
<li>from v$sysstat</li>
<li>where name in ('physical reads','db block gets','consistent gets');</li>
</ol>
</pre>
<p><strong>10)共享区库缓存区命中率</strong></p>
<p>计算公式：SUM(pins &#8211; reloads) / SUM(pins)</p>
<p>命中率应大于0.99</p>
<pre>
<ol>
<li>SQL&gt;select sum(pins-reloads)/sum(pins)</li>
<li>from v$librarycache;</li>
</ol>
</pre>
<p><strong>11)检测回滚段的争用</strong></p>
<p>SUM(waits)值应小于SUM(gets)值的1%</p>
<pre>
<ol>
<li>SQL&gt;select sum(gets),sum(waits),sum(waits)/sum(gets)</li>
<li>from v$rollstat;</li>
</ol>
</pre>
<p><strong>12)检测回滚段收缩次数</strong></p>
<pre>
<ol>
<li>SQL&gt;select name,shrinks</li>
<li>from v$rollstat, v$rollname</li>
<li>where v$rollstat.usn = v$rollname.usn;</li>
<li>-----------------------------------------------------------------------------</li>
</ol>
</pre>
<p>几个常用的检查语句</p>
<p>1. 查找排序最多的SQL:</p>
<pre>
<ol>
<li>SQL&gt;SELECT HASH_VALUE, SQL_TEXT, SORTS, EXECUTIONS</li>
<li>FROM V$SQLAREA</li>
<li>ORDER BY SORTS DESC;</li>
</ol>
</pre>
<p>2.查找磁盘读写最多的SQL:</p>
<pre>
<ol>
<li>SQL&gt;SELECT * FROM</li>
<li>(SELECT sql_text,disk_reads "total disk" , executions "total exec",disk_reads/executions "disk/exec" FROM v$sql</li>
<li>WHERE executions&gt;0 and is_obsolete='N' ORDER BY  4 desc)</li>
<li>WHERE ROWNUM&lt;11 ;</li>
</ol>
</pre>
<p>3.查找工作量最大的SQL(实际上也是按磁盘读写来排序的):</p>
<pre>
<ol>
<li>SQL&gt;select substr(to_char(s.pct, '99.00'), 2) || '%' load,s.executions executes,p.sql_text</li>
<li>from(select address,disk_reads,executions,pct,rank() over (order by disk_reads desc) ranking from</li>
<li>(select address,disk_reads,executions,100 * ratio_to_report(disk_reads) over () pct</li>
<li>from sys.v_$sql</li>
<li> where command_type != 47)</li>
<li>where disk_reads &gt; 50 * executions) s,sys.v_$sqltext p</li>
<li> where s.ranking &lt;= 5 and p.address = s.address</li>
<li>order by 1, s.address, p.piece;</li>
</ol>
</pre>
<p>4. 用下列SQL工具找出低效SQL:</p>
<pre>
<ol>
<li>SQL&gt;select executions,disk_reads,buffer_gets,round((buffer_gets-disk_reads)/buffer_gets,2) Hit_radio,round(disk_reads/executions,2) reads_per_run,sql_text</li>
<li>From v$sqlarea</li>
<li>Where executions&gt;0 and buffer_gets &gt;0 and (buffer_gets-disk_reads)/buffer_gets&lt;0.8</li>
<li>Order by 4 desc;</li>
</ol>
</pre>
<p>5、根据sid查看对应连接正在运行的sql</p>
<pre>
<ol>
<li>SQL&gt;select /*+ push_subq */command_type,sql_text,sharable_mem,persistent_mem,</li>
<li>runtime_mem,sorts,version_count,loaded_versions,open_versions,users_opening,executions,</li>
<li>users_executing,loads,first_load_time,invalidations,parse_calls,disk_reads,buffer_gets,</li>
<li>rows_processed,sysdate start_time,sysdate finish_time,’&gt;’||address sql_address,’N’status</li>
<li>From v$sqlarea</li>
<li>Where address=(select sql_address from v$session where sid=&amp;sid);</li>
<li>***************Oracle 缓冲区命中率低的分析及解决办法******************</li>
</ol>
</pre>
<p>首先确定下面的查询结果:</p>
<p>1,缓冲区命中率的查询(是否低于90%):</p>
<pre>
<ol>
<li>select round((1 - sum(decode(name,'physical reads',value,0)) /</li>
<li>(sum(decode(name,'db block gets',value,0)) + sum(decode(name,'consistent gets',value,0))) ),4) *100 || '%' chitrati</li>
<li>from v$sysstat;</li>
</ol>
</pre>
<p>2,使用率的查询(有无free状态的数据快.):</p>
<pre>
<ol>
<li>select count(*), status from v$bh group by status ;</li>
</ol>
</pre>
<p>3,相关等待事件的查询(是否有相关等待事件)</p>
<pre>
<ol>
<li>select event,total_waits from v$system_event where event in ('free buffer waits');</li>
</ol>
</pre>
<p>4,当前大小(是否已经很大)</p>
<pre>
<ol>
<li>select value/1024/1024 cache_size from v$parameter where name='db_cache_size'</li>
</ol>
</pre>
<p>5,top等待事件分析(Db file scatered read的比率是否大)</p>
<pre>
<ol>
<li>select event ,total_waits,suml</li>
<li>from</li>
<li>(select event,total_waits,round(total_waits/sumt*100,2)||'%' suml</li>
<li>from</li>
<li>(select event,total_waits from v$system_event ),</li>
<li>(select sum(total_waits) sumt from v$system_event)</li>
<li>order by total_waits desc)</li>
<li>where rownum&lt;6</li>
<li>and event not like 'rdbms%'</li>
<li>and event not like 'pmon%'</li>
<li>and event not like 'SQL*Net%'</li>
<li>and event not like 'smon%';</li>
</ol>
</pre>
<p>6,db_cache_advice建议值（9i后的新特性,可以根据他更好的调整cache_size）</p>
<pre>
<ol>
<li>select block_size,size_for_estimate,size_factor,estd_physical_reads from v$db_cache_advice;</li>
</ol>
</pre>
<p>说明分析:</p>
<p>缓冲区命中率(低于90的命中率就算比较低的).</p>
<p>没有free不一定说明需要增加,还要结合当前cache_size的大小(我们是否还可以再增大,是否有需要增加硬件,增加开销),<br />
空闲缓冲区等待说明进程找不到空闲缓冲区，并通过写出灰缓冲区，来加速数据库写入器生成空闲缓冲区，当DBWn将块写入磁盘后，灰数据缓冲区将被释放，以便重新使用.产生这种原因主要是:</p>
<p>1，DBWn可能跟不上写入灰缓冲区：i/0系统较慢，尽量将文件均匀的分布于所有设备，</p>
<p>2，缓冲区过小或过大。</p>
<p>3，可以增加db_writer_processes数量。</p>
<p>4,可能有很大的一个事物，或者连续的大事物</p>
<p>我们需要长期观察这个事件是否长期存在并数值一直在增大,如果一直在增大,则说明需要增大db_cache大小.或优化sql.<br />
数据分散读等待,通常表现存在着与全表扫描相关的等待，逻辑读时，在内存中进行的全表扫描一般是零散地，而并非连续的被分散到缓冲区的各个部分，可能有索引丢失，或被仰制索引的存在。该等待时间在数据库会话等待多块io读取结束的时候产生，并把指定的块数离散的分布在数据缓冲区。这意味这全表扫描过多，或者io不足或争用，</p>
<p>存在这个事件,多数都是问题的,这说明大量的全部扫描而未采用索引.</p>
<p>db_cache_advice对我们调整db_cache_size大小有一定的帮助,但这只是一个参考，不一定很精确。</p>
<p>通过上面6种情况的综合分析,判断是否需要增加大cache_size. 或者把常用的（小）表放到keep区。</p>
<p>但多数的时候做这些不会解决质的问题,</p>
<p>而真正的问题主要是对sql语句的优化(如:是否存在大量的全表扫描等)</p>
<p>索引是在不需要改变程序的情况下,对数据库性能，sql语句提高的最实用的方法.</p>
<p>我在生产中遇到过类似的问题,200M的cache_size,命中率很低21%,但通过对sql语句的优化(添加索引,避免全表扫描),命中率增加到96%,程序运行时间由原来的2小时减少到不到10分钟.</p>
<p>这就提到了怎么定位高消耗的sql问题.全表扫描的问题,在这里不做细致的解说,这里只说明方法,我会在相关的章节专门介绍怎么使用这些工具</p>
<p>1,sql_trace跟踪session.用tkprof 分别输出磁盘读,逻辑读,运行时间长的sql进行优化.这些高消耗的sql一般都伴随着全表扫描.</p>
<p>2,statspack分析.在系统繁忙时期进行时间点的统计分析,产看TOP事件是否有Db file scatered read.并查看TOP sql语句是否存在问题等.</p>
<p>注：电脑学习网首发。</p>
<p>还要说一句：当然在硬件允许的情况下，尽量增大db_cache_size 减少磁盘读，但并不是越大越好，一定要根据自己的库数据量的程度来调节，因为大的db_cache_size同样会增大数据库管理的开销，当然可能开销并不会明显的影响数据库的性能，硬件价格也越来越低，这就需要我们具体问题具体分析了，在我看来物尽其用就最好了，尽量不要浪费，找到问题的本质。调优是一件很艺术的事。</p>
<p>***********************Oracle数据库缓冲区命中率*****************<br />
1、查看Oracle数据库缓冲区命中率</p>
<pre>
<ol>
<li>select a.value + b.value "logical_reads", c.value "phys_reads",</li>
<li>    round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"</li>
<li>    from v$sysstat a, v$sysstat b, v$sysstat c</li>
<li>    where a.statistic# = 40 and b.statistic# = 41</li>
<li>    and c.statistic# = 42;</li>
</ol>
</pre>
<p>2、Tags: oracle</p>
<p>数据库缓冲区命中率：</p>
<pre>
<ol>
<li>sql&gt;select value from v$sysstat where name ='physical reads';</li>
<li>value</li>
<li>3714179</li>
<li>sql&gt;select value from v$sysstat where name ='physical reads direct';</li>
<li>value</li>
<li>0</li>
<li>sql&gt;select value from v$sysstat where name ='physical reads direct(lob)';</li>
<li>value</li>
<li>0</li>
<li>sql&gt;select value from v$sysstat where name ='consistent gets';</li>
<li>value</li>
<li>856309623</li>
<li>sql&gt;select value from v$sysstat where name ='db block gets';</li>
<li>value</li>
<li>19847790</li>
</ol>
</pre>
<p>这里命中率的计算应该是</p>
<p>令x＝physical reads direct + physical reads direct(lob)</p>
<p>命中率＝100－(physical reads -x)/(consistent gets +db block gets -x)*100</p>
<p>通常如果发现命中率低于90%，则应该调整应用可以考虑是否增大数据加</p>
<p>共享池的命中率</p>
<pre>
<ol>
<li>sql&gt; select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;</li>
</ol>
</pre>
<p>如果共享池的命中率低于95％就要考虑调整应用（通常是没应用bind var)或者增加内存。</p>
<p>关于排序部分</p>
<pre>
<ol>
<li>sql&gt; select name,value from v$sysstat where name like '%sort%';</li>
</ol>
</pre>
<p>如果我们发现sorts(disk)/(sorts(memory)+sorts(disk))的比例过高，则通常意味着sort_area_size部分内存教较小，可考虑调整相应的参数。</p>
<p>关于log_buffer</p>
<pre>
<ol>
<li>sql&gt;select name,value from v$sysstat where name in ('redo entries','redo buffer allocation retries');</li>
</ol>
</pre>
<p>假如redo buffer allocation retries/redo entries的比例超过1%我们就可以考虑增加log_buffer.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/759.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转】九大Oracle性能优化基本方法详解</title>
		<link>http://blog.globstudio.com/757.html</link>
		<comments>http://blog.globstudio.com/757.html#comments</comments>
		<pubDate>Fri, 23 Apr 2010 02:01:35 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=757</guid>
		<description><![CDATA[Oracle性能优化基本方法包括一下几个步骤，包括： 1）设立合理的Oracle性能优化目标。 2）测量并记录当前的Oracle性能。 3）确定当前Oracle性能瓶颈（Oracle等待什么、哪些SQL语句是该等待事件的成分）。 4）把等待事件记入跟踪文件。 5）确定当前的OS瓶颈。 6）优化所需的成分（应用程序、数据库、I/O、争用、OS等）。 7）跟踪并实施更改控制过程。 8）测量并记录当前性能 9）重复步骤3到7，直到满足优化目标 下面来一一详述。 1.设立合理的Oracle性能优化目标 重点：关于设立目标的最重要的一点是它们必须是可量化和可达到的。 方法：目标必须是当前性能和所需性能的的陈述形式的语句。 2.测量并记录当前Oracle性能重点： 1）需要在峰值活动时间获得当前系统性能快照 2）关键是要在出现性能问题的时间段内采集信息 3）必须在合理的时间段上采集，一般在峰值期间照几个为期15分钟的快照 3.确定当前Oracle性能瓶颈重点：从Oracle 等待接口v$system_event、v$session_event和v$session_wait中获得等待事件，进而找出影响性能的对象和sql语句。方法如下： 1)首先，利用v$system_event视图执行下面的查询查看数据库中某些常见的等待事件： select * from v$system_event where event in ('buffer busy waits', 'db file sequential read', 'db file scattered read', 'enqueue', 'free buffer waits', 'latch free', 'log file parallel write', 'log file sync'); 2)接着，利用下面对v$session_event和v$session视图进行的查询，研究具有对上面显示的内容有贡献的等待事件的会话： select se.sid,s.username,se.event,se.total_waits,se.time_waited,se.average_wait from v$session s,v$session_event se where s.sid = se.sid and se.event not like 'SQL*Net%' and s.status = 'ACTIVE' and s.username is not null; 3)使用下面查询找到与所连接的会话有关的当前等待事件。这些信息是动态的，为了查看一个会话的等待最多的事件是什么，需要多次执行此查询。 select sw.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_in_wait SEC_IN_WAIT from v$session s,v$session_wait sw where s.sid = sw.sid and sw.event not like 'SQL*Net%' and s.username is not null order by sw.wait_time desc; 4)查询会话等待事件的详细信息 select sid,event,p1text,p1,p2text,p2,p3text,p3 from v$session_wait where sid between &#38;1 and &#38;2 and event not like '%SQL%' and event not like '%rdbms%'; 5)利用P1、P2的信息，找出等待事件的相关的段 select owner,segment_name,segment_type,tablespace_name from dba_extents where file_id = &#38;fileid_in and &#38;blockid_in between block_id and block_id + blocks - 1; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Oracle性能优化基本方法包括一下几个步骤，包括：</strong></p>
<p>1）设立合理的Oracle性能优化目标。<br />
2）测量并记录当前的Oracle性能。<br />
3）确定当前Oracle性能瓶颈（Oracle等待什么、哪些SQL语句是该等待事件的成分）。<br />
4）把等待事件记入跟踪文件。<br />
5）确定当前的OS瓶颈。<br />
6）优化所需的成分（应用程序、数据库、I/O、争用、OS等）。<br />
7）跟踪并实施更改控制过程。<br />
8）测量并记录当前性能<br />
9）重复步骤3到7，直到满足优化目标</p>
<p>下面来一一详述。<br />
<span id="more-757"></span></p>
<p><strong>1.设立合理的Oracle性能优化目标</strong></p>
<p>重点：关于设立目标的最重要的一点是它们必须是可量化和可达到的。</p>
<p>方法：目标必须是当前性能和所需性能的的陈述形式的语句。</p>
<p><strong>2.测量并记录当前Oracle性能重点：</strong></p>
<p>1）需要在峰值活动时间获得当前系统性能快照</p>
<p>2）关键是要在出现性能问题的时间段内采集信息</p>
<p>3）必须在合理的时间段上采集，一般在峰值期间照几个为期15分钟的快照</p>
<p><strong>3.确定当前Oracle性能瓶颈</strong>重点：从Oracle 等待接口v$system_event、v$session_event和v$session_wait中获得等待事件，进而找出影响性能的对象和sql语句。方法如下：</p>
<p>1)首先，利用v$system_event视图执行下面的查询查看数据库中某些常见的等待事件：</p>
<pre>
<ol>
<li>select * from v$system_event</li>
<li>where event in ('buffer busy waits',</li>
<li>'db file sequential read',</li>
<li>'db file scattered read',</li>
<li>'enqueue',</li>
<li>'free buffer waits',</li>
<li>'latch free',</li>
<li>'log file parallel write',</li>
<li>'log file sync');</li>
</ol>
</pre>
<p>2)接着，利用下面对v$session_event和v$session视图进行的查询，研究具有对上面显示的内容有贡献的等待事件的会话：</p>
<pre>
<ol>
<li>select se.sid,s.username,se.event,se.total_waits,se.time_waited,se.average_wait</li>
<li>from v$session s,v$session_event se</li>
<li>where s.sid = se.sid</li>
<li>and se.event not like 'SQL*Net%'</li>
<li>and s.status = 'ACTIVE'</li>
<li>and s.username is not null;</li>
</ol>
</pre>
<p>3)使用下面查询找到与所连接的会话有关的当前等待事件。这些信息是动态的，为了查看一个会话的等待最多的事件是什么，需要多次执行此查询。</p>
<pre>
<ol>
<li>select sw.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_in_wait SEC_IN_WAIT</li>
<li>from v$session s,v$session_wait sw</li>
<li>where s.sid = sw.sid</li>
<li>and sw.event not like 'SQL*Net%'</li>
<li>and s.username is not null</li>
<li>order by sw.wait_time desc;</li>
</ol>
</pre>
<p>4)查询会话等待事件的详细信息</p>
<pre>
<ol>
<li>select sid,event,p1text,p1,p2text,p2,p3text,p3</li>
<li>from v$session_wait</li>
<li>where sid between &amp;1 and &amp;2</li>
<li>and event not like '%SQL%'</li>
<li>and event not like '%rdbms%';</li>
</ol>
</pre>
<p>5)利用P1、P2的信息，找出等待事件的相关的段</p>
<pre>
<ol>
<li>select owner,segment_name,segment_type,tablespace_name</li>
<li>from dba_extents</li>
<li>where file_id = &amp;fileid_in</li>
<li>and &amp;blockid_in between block_id and block_id + blocks - 1;</li>
</ol>
</pre>
<p>6)获得操作该段的sql语句：</p>
<pre>
<ol>
<li>select sid, getsqltxt(sql_hash_value,sql_address)</li>
<li>from v$session</li>
<li>where sid = &amp;sid_in;</li>
</ol>
</pre>
<p>7)getsqltxt函数</p>
<p>8)至此已经找到影响性能的对象和sql语句，可以有针对性地优化</p>
<p><strong>4.把等待事件记入跟踪文件</strong></p>
<p>重点：如果在跟踪系统上的等待事件时，由于某种原因遇到了麻烦，则可以将这些等待事件记入一个跟踪文件。方法如下：</p>
<p>1)对于当前会话：</p>
<pre>
<ol>
<li>alter session set timed_statistics=true;</li>
<li>alter session set max_dump_file_size=unlimited;</li>
<li>alter session set events '10046 trace name context forever, level 12';</li>
</ol>
</pre>
<p>2)执行应用程序，然后在USER_DUMP_DEST指出的目录中找到跟踪文件。</p>
<p>3)查看文件中以词WAIT开始的所有行。</p>
<p>4)对于其它的会话</p>
<p>5)确定会话的进程ID（SPID）。下面的查询识别出名称以A开始的所有用户的会话进程ID：</p>
<pre>
<ol>
<li>select S.Username, P.Spid from V$SESSION S, V$PROCESS P</li>
<li>where S.PADDR = P.ADDR and S.Username like 'A%';</li>
</ol>
</pre>
<p>6)以sysdba进入sqlplus执行</p>
<pre>
<ol>
<li>alter session set timed_statistics=true;</li>
<li>alter session set max_dump_file_size=unlimited;</li>
<li>oradebug setospid</li>
<li>oradebug unlimit</li>
<li>oradebug event 10046 trace name context forever, level X /* Where X = (1,4,8,12) */</li>
</ol>
</pre>
<p>7)跟踪某个时间间隔得会话应用程序。</p>
<p>8)在USER_DUMP_DEST 的值指出的目录中利用SPID查看跟踪文件</p>
<p>9)查看文件中以词WAIT开始的所有行。</p>
<p><strong>5.确定当前OS瓶颈</strong>1）Windows NT上的监控</p>
<p>使用控制面板-〉管理工具-〉性能即可</p>
<p>2）UNIX上的监控</p>
<p>使用通用性的工具，包括sar、iostat、cpustat、mpstat、netstat、top、osview等。</p>
<p><strong>6．Oracle性能优化所需的成分（应用程序、数据库、I/O、争用、OS等）。</strong></p>
<p><strong>7．跟踪并实施更改控制过程。</strong></p>
<p><strong>8．测量并记录当前Oracle性能</strong></p>
<p><strong>9．重复步骤3到7，直到满足优化目标</strong></p>
<p>【转自】<a href="http://database.51cto.com/art/201004/196136.htm">http://database.51cto.com/art/201004/196136.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/757.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

