<?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>dbtan 谈DB</title> <atom:link href="http://www.dbtan.com/feed" rel="self" type="application/rss+xml" /><link>http://www.dbtan.com</link> <description>dbtan的生活、Oracle及Linux学习笔记、观点  说，永远易于做！</description> <lastBuildDate>Sun, 03 Jul 2011 08:34:22 +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>How To Automate Cleanup Of Dead Connections And INACTIVE Sessions [ID 206007.1]</title><link>http://www.dbtan.com/2010/09/dead-connections-_or_inactive-sessions.html</link> <comments>http://www.dbtan.com/2010/09/dead-connections-_or_inactive-sessions.html#comments</comments> <pubDate>Wed, 15 Sep 2010 04:04:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[Oracle数据库管理]]></category> <category><![CDATA[Trouble Shooting]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/09/dead-connections-_or_inactive-sessions.html</guid> <description><![CDATA[How To Automate Cleanup Of Dead Connections And INACTIVE Sessions [ID 206007.1] Modified 25-JUN-2009&#160;&#160;&#160;&#160; Type HOWTO&#160;&#160;&#160;&#160; Status PUBLISHED PURPOSE ------- This note explains the difference between a dead connection and an INACTIVE session in v$session. It also discusses the mechanisms provided to automate the cleanup of each. SCOPE &#38; APPLICATION ------------------- This note is intended [...]]]></description> <content:encoded><![CDATA[<blockquote><p><strong>How To Automate Cleanup Of Dead Connections And INACTIVE Sessions [ID 206007.1]</strong></p><hr size="1"><p><em>Modified</em> 25-JUN-2009&nbsp;&nbsp;&nbsp;&nbsp; <em>Type</em> HOWTO&nbsp;&nbsp;&nbsp;&nbsp; <em>Status</em> PUBLISHED<pre>PURPOSE
-------

This note explains the difference between a dead connection and an
INACTIVE session in v$session.  It also discusses the mechanisms
provided to automate the cleanup of each.

SCOPE &amp; APPLICATION
-------------------

This note is intended for any DBA who wants to automate the cleanup of
dead connections and/or INACTIVE sessions.

Difference between INACTIVE sessions and Dead Connections
---------------------------------------------------------

Dead connections and INACTIVE sessions are different issues. Oracle
provides separate mechanisms to automate the cleanup of each.

(1) Dead connections:

    These are previously valid connections with the database but the
    connection between the client and server processes has terminated
    abnormally.

    Examples of a dead connection:

    - A user reboots/turns-off their machine without logging off
      or disconnecting from the database.
    - A network problem prevents communication between the client
      and the server.

    In these cases, the shadow process running on the server and the
    session in the database may not terminate. To automate the cleanup
    of these sessions, you can use the Dead Connection Detection (DCD)
    feature of Net8.

    When DCD is enabled, Net8 (server-side) sends a packet to the client.
    If the client is active, the packet is discarded. If the client has
    terminated, the server will receive an error and Net8 (server-side)
    will end that session.

    Refer to <a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;id=151972.1">Note:151972.1</a>: Dead Connection Detection (DCD) Explained,
    for details regarding DCD.

(2) INACTIVE Sessions:

    These are sessions that remain connected to the database with a
    status in v$session of INACTIVE.

    Example of an INACTIVE session:

    - A user starts a program/session, then leaves it running and idle
      for an extended period of time.

    To automate cleanup of INACTIVE sessions you can create a profile
    with an appropriate IDLE_TIME setting and assign that profile to
    the users.

    <a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;id=159978.1">Note:159978.1</a>: How To Automate Disconnection of Idle Sessions,
    outlines the steps to setup IDLE_TIME for this.
</pre></blockquote><p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/event-about-log.html" title="日志文件相关等待">日志文件相关等待</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/09/dead-connections-_or_inactive-sessions.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>认领博客 dbtan 谈DB</title><link>http://www.dbtan.com/2010/06/claim-blog.html</link> <comments>http://www.dbtan.com/2010/06/claim-blog.html#comments</comments> <pubDate>Sun, 20 Jun 2010 07:11:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[默认分类]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/06/claim-blog.html</guid> <description><![CDATA[认领博客 dbtan 谈DB QQREADERF129F7D46654828B 随机日志2009/11/30 -- 了解X$KSMSP视图2009/12/20 -- Redo故障的恢复2009/12/04 -- Library Cache Pin 及 Library Cache Lock分析2009/12/14 -- Redo 的内容2009/11/24 -- Shared Pool 的基本原理]]></description> <content:encoded><![CDATA[<p>认领博客 <a href="http://www.dbtan.com" target="_blank">dbtan 谈DB</a></p><p>QQREADERF129F7D46654828B</p><h4  class="related_post_title">随机日志</h4><ul class="related_post"><li>2010/04/09 -- <a href="http://www.dbtan.com/2010/04/awr.html" title="自动负载信息库：AWR的引入">自动负载信息库：AWR的引入</a></li><li>2010/02/01 -- <a href="http://www.dbtan.com/2010/02/flashback-query-recovery-delete-data.html" title="使用Flashback Query恢复误删除数据">使用Flashback Query恢复误删除数据</a></li><li>2009/12/05 -- <a href="http://www.dbtan.com/2009/12/library-cache-pin-waiting-event.html" title="LIBRARY CACHE PIN 等待事件">LIBRARY CACHE PIN 等待事件</a></li><li>2009/12/14 -- <a href="http://www.dbtan.com/2009/12/how-many-redo-has-produced.html" title="产生多少Redo">产生多少Redo</a></li><li>2009/12/23 -- <a href="http://www.dbtan.com/2009/12/rollback-segment-the-change.html" title="回滚段的前世今生">回滚段的前世今生</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/06/claim-blog.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Oracle 10g/11g Latch机制的变化</title><link>http://www.dbtan.com/2010/05/oracle-10g11g-latch.html</link> <comments>http://www.dbtan.com/2010/05/oracle-10g11g-latch.html#comments</comments> <pubDate>Thu, 13 May 2010 10:18:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/05/oracle-10g11g-latch.html</guid> <description><![CDATA[Oracle 10g/11g Latch机制的变化：前面曾经提到，Oracle的Latch机制采用spin来进行持有CPU的不断尝试，虽然通常Latch的获取会非常快（一般在微秒级），但是很多时候Latch竞争还是会引发极为严重的CPU争用。所以从Oracle 10g开始，Oracle尝试引入一种新的机制来代替传统的Latch机制，这就是Mutex机制，也就是互斥机制。和Latch相比，一个Mutex Get大约仅需要30～35个指令，而Latch Get则需要大约150～200个指令，同时在大小上，每个Mutex仅占大约16Bytes空间，而Latch在10gR2中要占用大约112Bytes空间。 在Oracle 10.2..0.1中一个新的参数_kks_use_mutex_pin被引入，不过缺省值为False： sys@TQGZS&#62; select x.ksppinm name, y.ksppstvl value, x.ksppdesc describ&#160; 2&#160; from sys.x$ksppi x , sys.x$ksppcv y&#160; 3&#160; where x.indx = y.indx&#160; 4&#160; and x.ksppinm like '%&#38;par%'&#160; 5&#160; /Enter value for par: kksold&#160;&#160; 4: and x.ksppinm like '%&#38;par%'new&#160;&#160; 4: and x.ksppinm like '%kks%'NAME&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; VALUE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DESCRIB------------------------- --------------- --------------------------------------------------------_kks_use_mutex_pin&#160;&#160;&#160;&#160;&#160;&#160;&#160; FALSE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Turning [...]]]></description> <content:encoded><![CDATA[<p>Oracle 10g/11g Latch机制的变化：<br />前面曾经提到，Oracle的Latch机制采用spin来进行持有CPU的不断尝试，虽然通常Latch的获取会非常快（一般在微秒级），但是很多时候Latch竞争还是会引发极为严重的CPU争用。所以从Oracle 10g开始，Oracle尝试引入一种新的机制来代替传统的Latch机制，这就是Mutex机制，也就是互斥机制。和Latch相比，一个Mutex Get大约仅需要30～35个指令，而Latch Get则需要大约150～200个指令，同时在大小上，每个Mutex仅占大约16Bytes空间，而Latch在10gR2中要占用大约112Bytes空间。<p>在Oracle 10.2..0.1中一个新的参数_kks_use_mutex_pin被引入，不过缺省值为False：</p><blockquote><p>sys@TQGZS&gt; select x.ksppinm name, y.ksppstvl value, x.ksppdesc describ<br />&nbsp; 2&nbsp; from sys.x$ksppi x , sys.x$ksppcv y<br />&nbsp; 3&nbsp; where x.indx = y.indx<br />&nbsp; 4&nbsp; and x.ksppinm like '%&amp;par%'<br />&nbsp; 5&nbsp; /<br />Enter value for par: kks<br />old&nbsp;&nbsp; 4: and x.ksppinm like '%&amp;par%'<br />new&nbsp;&nbsp; 4: and x.ksppinm like '%kks%'<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESCRIB<br />------------------------- --------------- --------------------------------------------------------<br />_kks_use_mutex_pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Turning on this will make KKS use mutex for cursor pins.</p></blockquote><p>这意味着新的Mutex机制已经准备好了用于应付Cursor Pin处理。在Oracle 10gR2/11gR1随后的版本中，这个参数被设置为Ture：</p><blockquote><p>sys@CCDB&gt; select * from v$version where rownum &lt; 2;<br />BANNER<br />----------------------------------------------------------------------------<br />Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production<br />sys@CCDB&gt; @GetHidPar.sql<br />Enter value for par: mutex<br />old&nbsp;&nbsp; 4: AND x.ksppinm LIKE '%&amp;par%'<br />new&nbsp;&nbsp; 4: AND x.ksppinm LIKE '%mutex%'<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESCRIB<br />------------------------------ -------------------- --------------------------------------------------------<br />_kks_use_mutex_pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Turning on this will make KKS use mutex for cursor pins.</p></blockquote><p>Mutex机制首先被引入用于替代Library Cache Latch以及Library Cache Pin等机制。使用Mutex Pin机制Oracle能够使用更少的CPU资源获得更好的性能。由于Mutex Pin机制带来的Cursor管理上性能提升，所以曾经用来缓解Cursor Latch竞争的参数CURSOR_SPACE_FOR_TIME从Oracle 10.2.0.5和Oracle 11.1.0.7开始将不再被支持。<p>在Oracle 11.1.0.6中，以下是数据库中Library Cache相关的Latch与等待：</p><blockquote><p>sys@CCDB&gt; select * from v$version where rownum &lt; 2;<br />BANNER<br />----------------------------------------------------------------------------<br />Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production<br />sys@CCDB&gt; select name from v$latch where name like '%library%';<br />NAME<br />------------------------------<br />library cache load lock<br />sys@CCDB&gt; select name from v$event_name where name like '%library%';<br />NAME<br />------------------------------<br />library cache pin<br />library cache lock<br />library cache load lock<br />library cache: mutex X<br />library cache: mutex S<br />OSD IPC library<br />library cache revalidation<br />library cache shutdown<br />8 rows selected.</p></blockquote><p>在Oracle Database 11g中，和Mutex相关的数据库描述已经被引入，首先的变化是和Library Cache相关的Latch仅余library cache load lock：</p><blockquote><p>sys@CCDB&gt; select * from v$version where rownum &lt; 2;<br />BANNER<br />----------------------------------------------------------------------------<br />Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production<br />sys@CCDB&gt; select name from v$latch where name like '%library%';<br />NAME<br />------------------------------<br />library cache load lock</p></blockquote><p>其次是等待事件引入了Library Cache:Mutex S/X等待，用以描述因为Mutex竞争而导致的Library Cache等待：</p><blockquote><p>sys@CCDB&gt; select name from v$event_name where name like '%library%';<br />NAME<br />------------------------------<br />library cache pin<br />library cache lock<br />library cache load lock<br />library cache: mutex X<br />library cache: mutex S<br />OSD IPC library<br />library cache revalidation<br />library cache shutdown<br />8 rows selected.</p></blockquote><p>虽然在Oracle Database 11gR1中，这些变化已经可以清晰地看到，但是一些问题仍然存在，Oracle仍然在通过一系列不断努力和改进使得这些新的变化走向成熟。<p>当然Library Cache Latch在某些条件下仍然会被用到，Oracle数据库的很多内容还在不断变化中。关于Mutex的信息主要可以通过两个视图来查询：v$mutex_sleep和v$mutex_sleep_history。以下是一个Oracle 11g生产环境中的查询示范输出：</p><blockquote><p>sys@CCDB&gt; select SLEEP_TIMESTAMP,MUTEX_TYPE,GETS,SLEEPS,LOCATION,MUTEX_VALUE<br />&nbsp; 2&nbsp; from v$mutex_sleep_history where rownum &lt;10;<br />SLEEP_TIMESTAMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MUTEX_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GETS&nbsp;&nbsp;&nbsp;&nbsp; SLEEPS LOCATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MUTEX_VALUE<br />------------------------------ --------------- ---------- ---------- -------------------- ----------------<br />11-MAY-10 08.46.15.176426 PM&nbsp;&nbsp; Cursor Pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20439381&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80 kksfbc [KKSCHLPIN1]&nbsp; 00<br />13-MAY-10 04.01.19.066757 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39098&nbsp;&nbsp;&nbsp;&nbsp; 113171 kglhdgn1&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000021E00000000<br />13-MAY-10 04.50.40.279082 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 172560&nbsp;&nbsp;&nbsp; 1384786 kgllkdl1&nbsp; 85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00<br />06-MAY-10 09.34.57.393852 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 76718&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43 kgllkdl1&nbsp; 85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 000001CC00000000<br />06-MAY-10 10.24.47.734523 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 103771&nbsp;&nbsp;&nbsp;&nbsp; 383024 kglhdgn1&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000031B00000000<br />13-MAY-10 04.50.40.328295 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150176&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46662 kgllkdl1&nbsp; 85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 000001C200000000<br />13-MAY-10 04.50.40.291834 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 208155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45 kgllkdl1&nbsp; 85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00<br />09-MAY-10 01.00.03.163520 AM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 kglhdgn1&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00<br />07-MAY-10 03.33.35.071512 PM&nbsp;&nbsp; Library Cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2933&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 kgllkdl1&nbsp; 85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000029700000000<br />9 rows selected.</p></blockquote><p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/event-about-log.html" title="日志文件相关等待">日志文件相关等待</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/05/oracle-10g11g-latch.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Latch Free（闩锁释放）</title><link>http://www.dbtan.com/2010/05/latch-free.html</link> <comments>http://www.dbtan.com/2010/05/latch-free.html#comments</comments> <pubDate>Thu, 13 May 2010 10:12:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/05/latch-free.html</guid> <description><![CDATA[Latch Free（闩锁释放）：Latch Free通常被称为闩锁释放，这个名称常常引起误解，实际上我们应该在前面加上一个“等待”（wait），当数据库出现这个等待时，说明有进程正在等待某个Latch被释放，也就是waiting latch free。 Latch是一种低级排队（串行）机制，用于保护SGA中共享内存结构。Latch就像是一种快速被获取和释放的内存锁，用于防止共享内存结构被多个用户同时访问。其实不必把Latch想得过于复杂，Latch通常就是操作系统利用内存中的某个区域，通过设置变量为0或非0，来表示Latch是否已经被取得，大多数操作系统，是使用TEST AND SET的方式来完成Latch检查或持有的。 为了快速地获得一个直观认识，以下示例展现的了Latch的获取与释放过程。Latch在内存中的位置及名称可以通过下面的语句查询获得： sys@CCDB&#62; select k.ksmfsadr,ksmfsnam,ksmfstyp,ksmfssiz,kslldnam,kslldlvl&#160; 2&#160; from x$ksmfsv k,x$kslld a&#160; 3&#160; where k.ksmfsnam = 'ksqeql_' and kslldnam = 'enqueues';KSMFSADR&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; KSMFSNAM&#160;&#160;&#160;&#160;&#160;&#160;&#160; KSMFSTYP&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; KSMFSSIZ KSLLDNAM&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; KSLLDLVL---------------- --------------- --------------- ---------- --------------- ----------000000006000CA68 ksqeql_&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ksllt&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 160 enqueues&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 5 得到这些信息之后，可以通过Latch的地址信息手工对Latch进行模拟的持有或释放，注意获取Latch使用了kslgetl过程，释放Latch使用了kslfre，也就是Latch Free过程，如下所示： sys@CCDB&#62; select to_number('000000006000CA68','XXXXXXXXXXXXXXXX') from dual;TO_NUMBER('000000006000CA68','XXXXXXXXXXXXXXXX')------------------------------------------------&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1610664552&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sys@CCDB&#62; oradebug setmypidStatement processed.sys@CCDB&#62; oradebug call [...]]]></description> <content:encoded><![CDATA[<p>Latch Free（闩锁释放）：<br />Latch Free通常被称为闩锁释放，这个名称常常引起误解，实际上我们应该在前面加上一个“等待”（wait），当数据库出现这个等待时，说明有进程正在等待某个Latch被释放，也就是waiting latch free。<p><strong>Latch是一种低级排队（串行）机制，用于保护SGA中共享内存结构。</strong>Latch就像是一种快速被获取和释放的内存锁，用于防止共享内存结构被多个用户同时访问。其实不必把Latch想得过于复杂，Latch通常就是操作系统利用内存中的某个区域，通过设置变量为0或非0，来表示Latch是否已经被取得，大多数操作系统，是使用TEST AND SET的方式来完成Latch检查或持有的。<p>为了快速地获得一个直观认识，以下示例展现的了Latch的获取与释放过程。Latch在内存中的位置及名称可以通过下面的语句查询获得：</p><blockquote><p>sys@CCDB&gt; select k.ksmfsadr,ksmfsnam,ksmfstyp,ksmfssiz,kslldnam,kslldlvl<br />&nbsp; 2&nbsp; from x$ksmfsv k,x$kslld a<br />&nbsp; 3&nbsp; where k.ksmfsnam = 'ksqeql_' and kslldnam = 'enqueues';<br />KSMFSADR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KSMFSNAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KSMFSTYP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KSMFSSIZ KSLLDNAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KSLLDLVL<br />---------------- --------------- --------------- ---------- --------------- ----------<br />000000006000CA68 ksqeql_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ksllt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 160 enqueues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5</p></blockquote><p>得到这些信息之后，可以通过Latch的地址信息手工对Latch进行模拟的持有或释放，注意获取Latch使用了kslgetl过程，释放Latch使用了kslfre，也就是Latch Free过程，如下所示：</p><blockquote><p>sys@CCDB&gt; select to_number('000000006000CA68','XXXXXXXXXXXXXXXX') from dual;<br />TO_NUMBER('000000006000CA68','XXXXXXXXXXXXXXXX')<br />------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1610664552&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />sys@CCDB&gt; oradebug setmypid<br />Statement processed.<br />sys@CCDB&gt; oradebug call kslgetl 1610664552 1<br />Function returned 1<br />sys@CCDB&gt; oradebug call kslfre 1610664552<br />Function returned 0</p></blockquote><p>在这个Latch的短时持有前后，观察这个Latch的等待时间，可以发现大量的Latch等待已经发生，如下所示，这就是Latch、Latch Get和Latch Free的一个直观案例。</p><blockquote><p>sys@CCDB&gt; select name,wait_time from v$latch where name = 'enqueues';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_TIME<br />------------------------------------------------------------ ----------<br />enqueues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />sys@CCDB&gt; select name,wait_time from v$latch where name = 'enqueues';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_TIME<br />------------------------------------------------------------ ----------<br />enqueues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p></blockquote><p>在数据库内部，Oracle通过v$latch视图记录不同类型Latch的统计数据，按获取和等待方式不同进行分类，Latch请求的类型可以分为willing-to-wait和immediate两类。<br />·willing-to-wait：是指如果所请求的Latch不能立即得到，请求进程将等待一段很短的时间后再次发出请求。进程一直重复此过程直到得到Latch。<br />·immediate：是指如果所请求的Latch不能立即得到，请求进程就不再等待，而是继续执行下去。</p><p>在v$latch中以下字段记录了willing-to-wait请求。<br />· GET：成功地以willing-to-wait请求类型请求一个Latch的次数。<br />· MISSES：初始以willing-to-wait请求类型请求一个Latch不成功，而进程进入等待的次数。<br />· SLEEPS：初始以willing-to-wait请求类型请求一个Latch不成功后，进程等待获取Latch时进入休眠的次数。<p>在v$latch中以下字段记录了immediate类请求。<br />· IMMEDIATE_GETS：以immediate请求类型成功地获得一个Latch的次数。<br />· IMMEDIATE_MISSES：以immediate请求类型请求一个Latch不成功的次数。<p>Oracle的Latch机制是竞争，其处理类似于网络里的CSMA/CD，所有用户进程争夺Latch，对于愿意等待类型（willing-to-wait）的Latch，如果一个进程在第一次尝试中没有获得Latch开始自旋（spin），<strong>如果经过_spin_count次争夺不能获得Latch，然后该进程转入睡眠状态，持续一段指定长度的时间，然后再次醒来，按顺序重复以前的步骤。</strong>这一过程可以下图来说明：<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="用户进程争夺Latch的过程" border="0" alt="用户进程争夺Latch的过程" src="http://dbtan.com/dbtan/blog_pic/LatchFreeLatchFree_FC7D/clip_image002.jpg" width="532" height="517"><p> SPIN的次数受隐含参数<strong>_spin_count</strong>影响，该参数的缺省值为2000。以下数据取自Oracle 11gR1 + Linux环境：</p><blockquote><p>sys@CCDB&gt; select * from v$version where rownum &lt; 2;<br />BANNER<br />----------------------------------------------------------------------------<br />Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production</p></blockquote><p>该系统存在4颗CPU：</p><blockquote><p>sys@CCDB&gt; show parameter cpu_count<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />------------------------------------ --------------- ---------<br />cpu_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</p></blockquote><p>_spin_count的缺省值即为2000：</p><blockquote><p>sys@CCDB&gt; @GetHidPar.sql<br />Enter value for par: _spin_count<br />old&nbsp;&nbsp; 4: AND x.ksppinm LIKE '%&amp;par%'<br />new&nbsp;&nbsp; 4: AND x.ksppinm LIKE '%_spin_count%'<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESCRIB<br />------------------------------ -------------------- ----------------------------------<br />_spin_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Amount to spin waiting for a latch<br />_kgx_spin_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; third spare parameter - integer</p></blockquote><p>从以上过程可以看到，在spin的过程中，进程会一直持有CPU，spin的机制是假设Latch可以被快速释放（正常情况下，Latch的持有时间是微秒级，相对spin机制如果直接采用Sleep方式引起的上下文切换会相当昂贵，所以Oracle针对Latch引入了spin算法），如果其他CPU上的其他进程释放了Latch，SPIN进程就可以立即获得这个Latch。如果系统只有单CPU，那就谈不上SPIN了。另一方面也可以看到，Latch竞争是非常昂贵的，可能导致严重的CPU耗用，所以Latch竞争在任何时候都应该引起充分的重视。经过spin后成功获得Latch的次数被记录在v$latch.spin_gets字段。通过下图来说明一下Latch竞争的情况。<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Latch竞争示意图" border="0" alt="Latch竞争示意图" src="http://dbtan.com/dbtan/blog_pic/LatchFreeLatchFree_FC7D/clip_image0027.jpg" width="404" height="297"><p>&nbsp;<p>继续来具体看一下willing-to-wait和immediate两类Latch的大致数量，以下查询来自Oracle 11gR1（同以上数据库）：</p><blockquote><p>sys@CCDB&gt; select count(*) from v$latch;<br />&nbsp; COUNT(*)<br />----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 496<br />sys@CCDB&gt; select count(*) from v$latch where IMMEDIATE_GETS + IMMEDIATE_MISSES &gt; 0;<br />&nbsp; COUNT(*)<br />----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26<br />sys@CCDB&gt; select count(*) from v$latch where IMMEDIATE_GETS + IMMEDIATE_MISSES = 0;<br />&nbsp; COUNT(*)<br />----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 470</p></blockquote><p>可以看到willing-to-wait类型的等待事件占了绝大部分，immediate类型的仅为少数：</p><blockquote><p>sys@CCDB&gt; select name,immediate_gets,immediate_misses,spin_gets<br />&nbsp; 2&nbsp; from v$latch<br />&nbsp; 3&nbsp; where immediate_gets + immediate_misses &gt; 0<br />&nbsp; 4&nbsp; order by immediate_gets desc;<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IMMEDIATE_GETS IMMEDIATE_MISSES&nbsp; SPIN_GETS<br />------------------------------ -------------- ---------------- ----------<br />cache buffers chains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 58212&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9<br />hash table column usage latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34803&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />cache buffers lru chain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30936&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17<br />redo copy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9646&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />redo allocation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9646&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />JOX SGA heap latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2257&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />space background task latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2102&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />checkpoint queue latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1712&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />In memory undo latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1371&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />simulator lru latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1312&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17<br />active service list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1077&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />Memory Management Latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1055&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />SQL memory manager latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />KTF sga latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 980&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />cache table scan latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 394&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />process queue reference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 131&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />job workq parent latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />process allocation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />MQL Tracking Latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />post/wait queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />SGA IO buffer pool latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />query server process&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />shared server configuration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />object queue header heap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />JOX JIT latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />object stats modification&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />26 rows selected.</p></blockquote><p>需要注意的是，immediate类型的Latch通常是因为存在多个可用Latch，最常见的如redo copy latch，当process想要取得redo copy latch时，它首先要求其中一个Latch，如果可以取得就持有该Latch，如果不能获取，它会立刻转向要求另一个redo copy latch，只有所有redo copy latch都无法取得时，才会sleep与wait。<p>immediate的另外一种原因是每个Latch都有level的概念（level=1 - 14），当一个process需要取得一组Latches时，为避免死锁，取得Latches有一定的顺序，即process新请求的Latch的level，应该大于process目前所握有的Latch的level。所以如果process要求的新Latch的level小于目前所持有的Latch的level，正常情况下，Oracle要求process先释放目前所持有的所有Latch，再依次取得这些Latch。为节省时间，Oracle允许进程以no-wait方式要求较低level的Latch，如果成功取得，既可以避免deadlcok又可以节省时间。<p>在Oracle 10g之前，Latch Free同Enqueue一样，是一个汇总等待。从Oracle 10g开始，这个等待被分解，现在可以更直接地通过会话等待得知具体的Latch发生在哪些资源上：</p><blockquote><p>sys@CCDB&gt; select name,wait_class<br />&nbsp; 2&nbsp; from v$event_name<br />&nbsp; 3&nbsp; where name like '%latch%';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_CLASS<br />-------------------------------------------------- --------------------<br />latch: cache buffers chains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch: redo writing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<br />latch: redo copy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<br />latch: Undo Hint Latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch: In memory undo latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch: MQL Tracking Latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch: row cache objects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch: shared pool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />latch free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch activity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />wait list latch activity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />wait list latch free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: session allocation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: messages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: enqueue hash chains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: ges resource hash list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />ges2 proc latch in rm latch get 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />ges2 proc latch in rm latch get 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />gcs remastering wait for write latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />gcs remastering wait for read latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: gcs resource hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: cache buffers lru chain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: checkpoint queue latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: cache buffer handles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />buffer latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: object queue header operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: redo allocation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: gc element&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: undo global data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: Change Notification Hash table latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: change notification client cache latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: lob segment hash table latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: lob segment query latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: lob segment dispenser latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />waiting to get CAS latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />waiting to get RM CAS latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: virtual circuit queues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />PX qref latch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />latch: parallel query alloc buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other<br />39 rows selected.</p></blockquote><p>最常见的Latch集中于Buffer Cache的竞争和Shared Pool的竞争。和Buffer Cache相关的主要Latch竞争有cache buffers chains和cache buffers lru chain，和Shared Pool相关的主要Latch竞争有Shared Pool Latch和Library Cache Latch等。<p>Buffer Cache的Latch竞争经常是由于热点块竞争引起；Shared Pool的Latch竞争通常是由于SQL的量硬解析引起。<p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/event-about-log.html" title="日志文件相关等待">日志文件相关等待</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/05/latch-free.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Enqueue （队列等待）</title><link>http://www.dbtan.com/2010/05/enqueue.html</link> <comments>http://www.dbtan.com/2010/05/enqueue.html#comments</comments> <pubDate>Thu, 13 May 2010 09:53:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/05/enqueue.html</guid> <description><![CDATA[Enqueue （队列等待）：Enqueue是一种保护共享资源的锁定机制。该锁定机制保护共享资源，以避免因并发操作而损坏数据，比如通过锁定保护一行记录，避免多个用户同时更新。Enqueue采用排队机制，即FIFO（先进先出）来控制资源的使用。 在Oracle 10g之前，Enqueue事件是一组锁定事件的集合，如果数据库中这个等待事件比较显著，我们还需要进一步来追踪是哪个类别的锁定引发了数据库等待。 从Oracle 10g开始，Oracle对于队列等待进行了细分，v$event_name视图中可以查询这些细分后的等待事件，简要摘录几个示例如下： sys@CCDB&#62; select name,wait_class&#160; 2&#160; from v$event_name&#160;&#160;&#160;&#160;&#160; &#160; 3&#160; where name like '%enq%';NAME&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WAIT_CLASS------------------------------------- ------------------------enq: PW - flush prewarm buffers&#160;&#160;&#160;&#160;&#160;&#160; Applicationenq: RO - contention&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Applicationenq: RO - fast object reuse&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Applicationenq: KO - fast object checkpoint&#160;&#160;&#160;&#160;&#160; Applicationenq: TM - contention&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Applicationenq: ST - contention&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Configurationenq: TX - row lock contention&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description> <content:encoded><![CDATA[<p>Enqueue （队列等待）：<br />Enqueue是一种保护共享资源的锁定机制。该锁定机制保护共享资源，以避免因并发操作而损坏数据，比如通过锁定保护一行记录，避免多个用户同时更新。Enqueue采用排队机制，即FIFO（先进先出）来控制资源的使用。<p>在Oracle 10g之前，Enqueue事件是一组锁定事件的集合，如果数据库中这个等待事件比较显著，我们还需要进一步来追踪是哪个类别的锁定引发了数据库等待。<p>从Oracle 10g开始，Oracle对于队列等待进行了细分，v$event_name视图中可以查询这些细分后的等待事件，简要摘录几个示例如下：</p><blockquote><p>sys@CCDB&gt; select name,wait_class<br />&nbsp; 2&nbsp; from v$event_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; 3&nbsp; where name like '%enq%';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_CLASS<br />------------------------------------- ------------------------<br />enq: PW - flush prewarm buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: RO - contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: RO - fast object reuse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: KO - fast object checkpoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: TM - contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: ST - contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<br />enq: TX - row lock contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application<br />enq: TX - allocate ITL entry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<br />enq: TX - index contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Concurrency<br />enq: TW - contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Administrative<br />enq: HW - contention&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<br />......</p></blockquote><p>Oracle 的锁按照类型可以分为排他锁（Exclusive，缩写为X）与共享锁（Share，缩写为S），或者是两者的组合锁。排他锁（X）也被称为独占锁，在排他锁释放之前，一个对象上不能施加任何其他类型的锁定；而共享锁（S）在释放之前，对象上还可以继续加其他类型的共享锁，但是不能加排他锁。<p>如果按照事务的类型划分，又可以将锁定划分为DML锁，DDL锁以及内存锁（也即通常所说的Latch）。Oracle在数据库内部用Enqueue等待来记录锁定，通过Latch Free等待事件来记录闩。Enqueue等待常见的有ST、HW、TX、TM等，下面择要进行介绍。<p><strong><font size="4">1. 最重要的锁定：TM与TX锁</font></strong><br />对于数据库来说，最常见的锁定类型是TM以及TX锁定。<p>TX锁通常被称为事务锁，当一个事务开始时，如执行INSERT/DELETE/UPDATE/MERGE等操作或者使用SELECT ... FOR UPDATE语句进行查询时，会首先获取事务锁，直到该事务结束。Oracle的TX锁定是在行级获得的，每个数据行上都存在一个锁定位（1b-Lock Byte），用于判断该记录是否被锁定，同时在每个数据块的头部（Header）存在一个ITL的数据结构，用于记录事务信息等，当需要修改数据时，首先需要获得回滚段空间用于存储前镜像信息，然后这个事务信息同样被记录在ITL上，通过ITL可以将回滚信息和数据块关联起来，所以说<strong>Oracle的行级锁定是在数据块上获得的，行级锁只有排他锁没有共享模式</strong>。<p>TM锁通常称为表级锁，可以通过手工发出lock命令获得，或者通过DML操作以及SELECT FOR UPDATE获得，表级锁可以防止其他进程对表加X排他锁，防止在对数据修改时，其他任务通过DDL来修改表结构或者truncate、drop表等操作。可以通过v$lock视图来观察锁定信息，其中TYPE字段表示锁定类型。对于TM锁LMODE字段又代表了不同级别的TM锁，这些级别包括2-row-S(SS)、3-row-X(SX)、4-share(S)、5-S/Row-X(SSX)和6-exclusive(X)。<p>当执行DML操作时，首先加TM锁，如果能获得锁定，则继续加TX事务锁。在一个会话中，一般只存在一个TX事务锁，在提交或回滚之前，该会话的所有DML操作都属于一个事务，使用一个回滚段，占用一个回滚段事务槽（Slot）。<p>以下通过SCOTT用户锁定一行记录，暂时不要提交：</p><blockquote><p>scott@CCDB&gt; update emp set sal = 4000 where empno = 7788;<br />1 row updated.</p></blockquote><p>在另外session通过v$lock视图可以看到相关的锁定信息；</p><blockquote><p>sys@CCDB&gt; select sid,username from v$session where username = 'SCOTT';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID USERNAME<br />---------- ------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1075 SCOTT<br />sys@CCDB&gt; select * from v$lock where sid = 1075;<br />ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID TY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LMODE&nbsp;&nbsp;&nbsp; REQUEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK<br />---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------<br />000000008F836260 000000008F8362B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1075 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1208&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00002BA14E74A7F8 00002BA14E74A858&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1075 TM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 69539&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />000000008DF49A30 000000008DF49AA8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1075 TX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65551&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30498&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</p></blockquote><p>此时表上的行级排他锁会阻塞对于表的DDL语句：</p><blockquote><p>sys@CCDB&gt; truncate table scott.emp;<br />truncate table scott.emp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />ERROR at line 1:<br />ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired</p></blockquote><p>此外，TM锁定的ID1代表的就是锁定的对象号：</p><blockquote><p>sys@CCDB&gt; select owner,object_name from dba_objects where object_id = 69539;<br />OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OBJECT_NAME<br />--------------- ---------------<br />SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMP</p></blockquote><p>而TX锁的ID1代表的是事务的回滚段回滚段号、事务槽号，ID2代表的是顺序号：</p><blockquote><p>sys@CCDB&gt; select trunc(65551/power(2,16)),mod(65551,power(2,16)) from dual;<br />TRUNC(65551/POWER(2,16)) MOD(65551,POWER(2,16))<br />------------------------ ----------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15</p></blockquote><p>通过v$transaction视图也可以找到这个事务的信息（注意XIDSQN正是TX锁的ID2信息）：</p><blockquote><p>sys@CCDB&gt; select XIDUSN,XIDSLOT,XIDSQN from v$transaction;<br />&nbsp;&nbsp;&nbsp; XIDUSN&nbsp;&nbsp;&nbsp; XIDSLOT&nbsp;&nbsp;&nbsp;&nbsp; XIDSQN<br />---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30498</p></blockquote><p>如果转储回滚段信息进行分析，再结合ITL事务槽，可以清晰地看到锁定的含义以及整个事务的处理过程。<p>&nbsp;<p><strong><font size="4">2. 最常见的锁定：MR与AE锁<br /></font></strong>可能很多朋友都注意过，在v$lock视图中，最常见的其实是MR锁，也就是介质恢复锁（Media Recovery）：</p><blockquote><p>sys@CCDB&gt; select * from v$lock where type = 'MR';<br />ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID TY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LMODE&nbsp;&nbsp;&nbsp; REQUEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK<br />---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------<br />00000000BC2EE378 00000000BC2EE3D0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE448 00000000BC2EE4A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE518 00000000BC2EE570&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE5E8 00000000BC2EE640&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE6B8 00000000BC2EE710&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE788 00000000BC2EE7E0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE858 00000000BC2EE8B0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE940 00000000BC2EE998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EEA10 00000000BC2EEA68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984045&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2F12F8 00000000BC2F1350&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1097 MR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 1132526&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />10 rows selected.</p></blockquote><p><strong>MR锁用于保护数据库文件，使得文件在数据库打开、表空间Online时不能执行恢复。</strong>当进程对数据文件执行恢复时，需要排他的获得MR锁。当数据库打开时，每个文件上都分配一个MR锁。注意在以上输出中ID1代表文件号，其中也包含了201号临时文件。<p>从Oracle Database 11g开始，除了每个文件要获得MR锁之外，<strong>每个登录数据库的会话现在都会缺省获得一个AE锁：</strong></p><blockquote><p>sys@CCDB&gt; select * from v$lock where type = 'AE' and rownum &lt;= 5;<br />ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID TY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LMODE&nbsp;&nbsp;&nbsp; REQUEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK<br />---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------<br />00000000BC2EDF68 00000000BC2EDFC0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 822 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 2761930&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE108 00000000BC2EE160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 946 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 3458645&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE1D8 00000000BC2EE230&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1003 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 207674&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EE2A8 00000000BC2EE300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1092 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6984538&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />00000000BC2EEAE0 00000000BC2EEB38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 991 AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 3458644&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</p></blockquote><p>现在MR锁定和AE锁定是数据库中最为常见的锁定。</p><blockquote><p><a href="mailto:sys@CCDB">sys@CCDB</a>&gt; select name from v$event_name where name like '%AE%';<br />NAME<br />------------------------------------------------------------<br />enq: AE - lock</p></blockquote><p>&nbsp;<p><strong><font size="4">3. ST（空间事务锁）</font></strong><br />ST锁主要用于空间管理和字典管理的表空间（DMT）的区间分配，在DMT中典型的是对于uet$和fet$数据字典表的争用。对于支持LMT的版本。应该尽量使用本地管理表空间，或者考虑手工预分配一定数量的区（Extent），减少动态扩展时发生的严重队列竞争。<p>以下案例说明了ST锁可能会导致的严重性能问题。</p><blockquote><p>DB Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB Id&nbsp;&nbsp;&nbsp; Instance&nbsp;&nbsp;&nbsp;&nbsp; Inst Num Release&nbsp;&nbsp;&nbsp;&nbsp; OPS Host <br />------------ ----------- ------------ -------- ----------- --- ------------------ <br />DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40757346&nbsp;&nbsp;&nbsp; tqgzs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 8.1.7.4.0&nbsp;&nbsp; NO&nbsp; server <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Snap Id&nbsp;&nbsp;&nbsp;&nbsp; Snap Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sessions <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------- ------------------ -------- <br />Begin Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2845 31-10月-03 02:10:16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46 <br />&nbsp; End Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2848 31-10月-03 03:40:05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46 <br />&nbsp;&nbsp; Elapsed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 89.82 (mins)</p></blockquote><p>对于一个Statspack的report，采样时间是非常重要的维度，离开时间做参考，任何等待都不足以说明问题。</p><blockquote><p>Top 5 Wait Events <br />~~~~~~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; % Total <br />Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits&nbsp; Time (cs)&nbsp;&nbsp; Wt Time <br />-------------------------------------------- ------------ ------------ ------- <br /><strong>enqueue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53,793&nbsp;&nbsp; 16,192,686&nbsp;&nbsp; 67.86 <br /></strong>rdbms ipc message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19,999&nbsp;&nbsp;&nbsp; 5,927,350&nbsp;&nbsp; 24.84 <br />pmon timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,754&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 538,797&nbsp;&nbsp;&nbsp; 2.26 <br />smon timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 522,281&nbsp;&nbsp;&nbsp; 2.19 <br />SQL*Net message from client&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 94,525&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 520,104&nbsp;&nbsp;&nbsp; 2.18 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------------------------------------------------------</p></blockquote><p>在Statspack分析中，Top 5等待事件是我们最为关注的部分。这个系统中，除了enqueue等待事件以外，其他4个都属于空闲等待事件，无须关注。来关注一下enqueue等待事件，在89.82 (mins)的采样间隔内，累计enqueue等待长达16,192,686(cs)，即45小时左右。这个等待已经太过显著，实际上这个系统也正因此遭遇了巨大的困难，观察到队列等待以后，这应该关注队列等待在等待什么资源。快速跳转的Statspack的其他部分，看到以下详细内容：</p><blockquote><p>Enqueue activity for DB: DB&nbsp; Instance: aaa&nbsp; Snaps: 2845 -2848 <br />-&gt; ordered by waits desc, gets desc <br />Enqueue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gets&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits <br />---------- ------------ ---------- <br />ST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,554&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,554 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------------------------------------------------------</p></blockquote><p>看到主要队列等待在等待ST锁定，对于DMT，我们说这个等待和FET$、UET$的争用紧密相关。再回过头来研究捕获SQL语句：</p><blockquote><p>-&gt; End Buffer Gets Threshold:&nbsp;&nbsp; 10000 <br />-&gt; Note that resources reported for PL/SQL includes the resources used by <br />&nbsp;&nbsp; all SQL statements called within the PL/SQL code.&nbsp; As individual SQL <br />&nbsp;&nbsp; statements are also reported, it is possible and valid for the summed <br />&nbsp;&nbsp; total % to exceed 100 <br />&nbsp; Buffer Gets&nbsp;&nbsp;&nbsp; Executions&nbsp; Gets per Exec&nbsp; % Total&nbsp; Hash Value <br />--------------- ------------ -------------- ------- ------------ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4,800,073&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10,268&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 467.5&nbsp;&nbsp;&nbsp; 51.0&nbsp;&nbsp; 2913840444 <br />select length from fet$ where file#=:1 and block#=:2 and ts#=:3 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 803,187&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10,223&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 78.6&nbsp;&nbsp;&nbsp;&nbsp; 8.5&nbsp;&nbsp;&nbsp; 528349613 <br />delete from uet$ where ts#=:1 and segfile#=:2 and segblock#=:3 a <br />nd ext#=:4 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 454,444&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10,300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 44.1&nbsp;&nbsp;&nbsp;&nbsp; 4.8&nbsp;&nbsp; 1839874543 <br />select file#,block#,length from uet$ where ts#=:1 and segfile#=: <br />2 and segblock#=:3 and ext#=:4 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23,110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10,230&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3&nbsp;&nbsp;&nbsp;&nbsp; 0.2&nbsp;&nbsp; 3230982141 <br />insert into fet$ (file#,block#,ts#,length) values (:1,:2,:3,:4) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21,201&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 347&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61.1&nbsp;&nbsp;&nbsp;&nbsp; 0.2&nbsp;&nbsp; 1705880752 <br />select file# from file$ where ts#=:1 <br />…. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9,505&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 792.1&nbsp;&nbsp;&nbsp;&nbsp; 0.1&nbsp;&nbsp; 1714733582 <br />select f.file#, f.block#, f.ts#, f.length from fet$ f, ts$ t whe <br />re t.ts#=f.ts# and t.dflextpct!=0 and t.bitmapped=0 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6,426&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 235&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27.3&nbsp;&nbsp;&nbsp;&nbsp; 0.1&nbsp;&nbsp; 1877781575 <br />delete from fet$ where file#=:1 and block#=:2 and ts#=:3</p></blockquote><p>可以看到数据库频繁操作UET$、FET$系统表已经成为了系统的主要瓶颈。<p>至此，已经可以准确地为该系统定位问题，相应的解决方案也很容易确定，在Oracle 8.1.7中使用LMT代替DMT，这是解决问题的根本办法，当然实施起来还要进行综合考虑，实际情况还要复杂得多。<p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/event-about-log.html" title="日志文件相关等待">日志文件相关等待</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/05/enqueue.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>日志文件相关等待</title><link>http://www.dbtan.com/2010/05/event-about-log.html</link> <comments>http://www.dbtan.com/2010/05/event-about-log.html#comments</comments> <pubDate>Thu, 13 May 2010 09:35:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/05/event-about-log.html</guid> <description><![CDATA[日志文件相关等待：redo对于数据库来说非常重要，有一系统等待事件和日志相关，通过v$event_name视图可以找到这些等待事件： sys@CCDB&#62; select name from v$event_name where name like '%log%';NAME--------------------------------------------------logout restrictorLNS ASYNC archive logLNS ASYNC end of loglog file sequential readlog file single writelog file parallel writelog buffer spacelog file switch (checkpoint incomplete)log file switch (private strand flush incomplete)log file switch (archiving needed)switch logfile commandlog file switch completionlog file syncsimulated log write delayStreams capture: waiting [...]]]></description> <content:encoded><![CDATA[<p>日志文件相关等待：<br />redo对于数据库来说非常重要，有一系统等待事件和日志相关，通过v$event_name视图可以找到这些等待事件：</p><blockquote><p>sys@CCDB&gt; select name from v$event_name where name like '%log%';<br />NAME<br />--------------------------------------------------<br />logout restrictor<br />LNS ASYNC archive log<br />LNS ASYNC end of log<br />log file sequential read<br />log file single write<br />log file parallel write<br />log buffer space<br />log file switch (checkpoint incomplete)<br />log file switch (private strand flush incomplete)<br />log file switch (archiving needed)<br />switch logfile command<br />log file switch completion<br />log file sync<br />simulated log write delay<br />Streams capture: waiting for archive log<br />ges RMS0 retry add redo log<br />gcs log flush sync<br />log switch/archive<br />ARCH wait for archivelog lock<br />MRP wait on archivelog delay<br />MRP wait on archivelog arrival<br />MRP wait on archivelog archival<br />log file switch (clearing log file)<br />enq: XR - database force logging<br />recovery area: computing applied logs<br />enq: FL - Flashback database log<br />flashback free VI log<br />flashback log switch<br />log write(odd)<br />log write(even)<br />30 rows selected.</p></blockquote><p>下面摘录几个重要事件进行详细介绍。<p><strong><font size="4">1. log file switch（日志文件切换）：<br /></font>log file switch当日志文件发生切换时出现，在数据库进行日志切换后，后台进程LGWR需要关闭当前日志组，切换并打开下一个日志组，在这个切换过程中，数据库的所有DML操作都处于停顿状态，直至这个切换完成。</strong><p>log file switch主要包含两个事件，log file switch (checkpoint incomplete)和log file switch (archiving needed)。<br /><strong>⑴ log file switch (archiving needed)，即日志切换（需要归档），这个等待事件出现时通常是因为日志组循环写满以后，在需要覆盖先前日志时，发现日志归档尚未完成，出现该等待。</strong>由于redo能不写出，该等待出现时，数据库将陷于停顿状态。<p>出现该等待，可能表示I/O存在问题、归档进程写出缓慢，也有可能是日志组设置不合理等原因导致。针对不同原因，可以考虑采用解决办法有：<br />·可以考虑增大日志文件和增加日志组；<br />·移动归档文件到快速磁盘；<br />·调整log_archive_max_processes参数等。<p><strong>⑵ log file switch (checkpoint incomplete)，即日志切换（检查点未完成）。当所有的日志组都写满之后，LGWR试图覆盖某个日志文件，如果这时数据库没有完成写出由这个日志文件所保护的脏数据时（检查点未完成），该等待事件出现。</strong>该等待出现时，数据库同样将陷于停顿状态。<p>同时警告日志文件中会记录如下信息：</p><blockquote><p>Sat Feb 13 06:10:52 2010<br />Thread 1 advanced to log sequence 5115<br />&nbsp; Current log# 3 seq# 5115 mem# 0: /home/oracle/app/oracle/oradata/ccdb/redo03.log<br />Thread 1 cannot allocate new log, sequence 5116<br />Checkpoint not complete<br />&nbsp; Current log# 3 seq# 5115 mem# 0: /home/oracle/app/oracle/oradata/ccdb/redo03.log<br />Thread 1 advanced to log sequence 5116<br />&nbsp; Current log# 1 seq# 5116 mem# 0: /home/oracle/app/oracle/oradata/ccdb/redo01.log</p></blockquote><p>该等待事件通常表示DBWR写出速度太慢或者I/O存在问题。为解决该问题，用户可能需要考虑增加额外的DBWR或者增加日志组或日志文件大小。log file switch引起的等待都是非常重要的，如果出现就应该引起重视，并由DBA介入进行及时处理。<p><strong><font size="4">2. log file sync（日志文件同步）：</font></strong><br /><strong>当一个用户提交或回滚数据时，LGWR将会话期的重做由日志缓冲器写入到重做日志中，LGWR完成任务以后会通知用户进程。</strong>日志文件同步过程（Log File Sync）必须等待这一过程成功完成。对于回滚操作，该事件记录从用户发出rollback命令到回滚完成的时间。<p><strong>如果该等待过多，可能说明LGWR的写出效率低下，或者系统提交过于频繁。</strong>针对该问题，可以关注log file parallel write等待事件，或者通过user commits、user rollback等统计信息观察提交或回滚次数。<p>可能的解决方案主要有：<br />·提高LGWR性能，尽量使用快速磁盘，不要把redo log file存放在RAID5的磁盘上；<br />·使用批量提交；<br />·适当使用NOLOGGING/UNRECOVERABLE等选项。<p>可以通过如下公式计算平均redo写大小：</p><blockquote><p><em><strong>avg.redo writ size = (redo block written/redo writes)*512 bytes </strong></em></p></blockquote><p>如果系统产生redo很多，而每次写的较少，一般说明LGWR被过于频繁地激活了。可能导致过多的redo相关latch的竞争，而且Oracle可能无法有效地使用piggyback的功能。<p>从一个Statspack报告中提取一些数据来研究一下这个问题。<br />Report概要信息如下：</p><blockquote><p>STATSPACK report for</p><p>Database&nbsp;&nbsp;&nbsp; DB Id&nbsp;&nbsp;&nbsp; Instance&nbsp;&nbsp;&nbsp;&nbsp; Inst Num&nbsp; Startup Time&nbsp;&nbsp; Release&nbsp;&nbsp;&nbsp;&nbsp; RAC<br />~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3317656585 ccdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 03-Feb-10 22:20 11.1.0.6.0&nbsp; NO<p>Host Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Platform&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPUs Cores Sockets&nbsp;&nbsp; Memory (G)<br />~~~~ ---------------- ---------------------- ----- ----- ------- ------------<br />&nbsp;&nbsp;&nbsp;&nbsp; MWSG1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux 64-bit for AMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.5<p>Snapshot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Snap Id&nbsp;&nbsp;&nbsp;&nbsp; Snap Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sessions Curs/Sess Comment<br />~~~~~~~~&nbsp;&nbsp;&nbsp; ---------- ------------------ -------- --------- -------------------<br />Begin Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22 14-Apr-10 10:00:04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0<br />&nbsp; End Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23 14-Apr-10 11:00:05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 233&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1<br />&nbsp;&nbsp; Elapsed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60.02 (mins)<br />&nbsp;&nbsp; DB time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 244.73 (mins)&nbsp;&nbsp;&nbsp;&nbsp; DB CPU:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.92 (mins)<p>Cache Sizes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End<br />~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---------- ----------<br />&nbsp;&nbsp;&nbsp; Buffer Cache:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 912M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Std Block Size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8K<br />&nbsp;&nbsp;&nbsp;&nbsp; Shared Pool:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 576M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log Buffer:&nbsp;&nbsp;&nbsp;&nbsp; 6,939K<p>Load Profile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Per Second&nbsp;&nbsp;&nbsp; Per Transaction&nbsp;&nbsp;&nbsp; Per Exec&nbsp;&nbsp;&nbsp; Per Call<br />~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------------&nbsp; ----------------- ----------- -----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB time(s):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB CPU(s):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Redo size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,148.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10,147.7</p></blockquote><p>等待事件如下：</p><blockquote><p>Top 5 Timed Events&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Avg %Total<br />~~~~~~~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait&nbsp;&nbsp; Call<br />Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits&nbsp;&nbsp;&nbsp; Time (s)&nbsp;&nbsp; (ms)&nbsp;&nbsp; Time<br />----------------------------------------- ------------ ----------- ------ ------<br />db file sequential read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 249,549&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12,994&nbsp;&nbsp;&nbsp;&nbsp; 52&nbsp;&nbsp; 81.7<br /><strong>log file sync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9,125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,092&nbsp;&nbsp;&nbsp; 120&nbsp;&nbsp;&nbsp; 6.9<br />log file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8,932&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 864&nbsp;&nbsp;&nbsp;&nbsp; 97&nbsp;&nbsp;&nbsp; 5.4<br />control file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,189&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 425&nbsp;&nbsp;&nbsp; 357&nbsp;&nbsp;&nbsp; 2.7<br /></strong>CPU time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 324&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Avg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %Total<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %Tim Total Wait&nbsp;&nbsp; wait&nbsp;&nbsp;&nbsp; Waits&nbsp;&nbsp; Call<br />Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits&nbsp; out&nbsp;&nbsp; Time (s)&nbsp;&nbsp; (ms)&nbsp;&nbsp;&nbsp;&nbsp; /txn&nbsp;&nbsp; Time<br />---------------------------- ------------ ---- ---------- ------ -------- ------<br />db file sequential read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 249,549&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 12,994&nbsp;&nbsp;&nbsp;&nbsp; 52&nbsp;&nbsp;&nbsp; 136.6&nbsp;&nbsp; 81.7<br /><strong>log file sync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9,125&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,092&nbsp;&nbsp;&nbsp; 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.0&nbsp;&nbsp;&nbsp; 6.9<br />log file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8,932&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 864&nbsp;&nbsp;&nbsp;&nbsp; 97&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.9&nbsp;&nbsp;&nbsp; 5.4<br />control file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,189&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 425&nbsp;&nbsp;&nbsp; 357&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.7&nbsp;&nbsp;&nbsp; 2.7 </strong></p></blockquote><p><strong>注意以上的输出信息，这里log file sync和log file parallel write还有control file parallel write等待事件同时出现，那么可能的一个原因是I/O竞争导致了性能问题</strong>，实际用户环境正是日志文件和数据文件和控制文件等同时存放在RAID5的磁盘上，存在性能问题需要调整。<p>统计信息如下：</p><blockquote><p>Statistic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Total&nbsp;&nbsp;&nbsp;&nbsp; per Second&nbsp;&nbsp;&nbsp; per Trans<br />--------------------------------- ------------------ -------------- ------------<br />......<br />redo blocks checksummed by FG (ex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12,546&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.9<br />redo blocks written&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>42,942</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23.5<br />redo blocks written for direct wr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65,824&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36.0<br />redo buffer allocation retries&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />redo entries&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43,842&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24.0<br />redo log space requests&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />redo log space wait time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />redo ordering marks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 788&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.4<br />redo size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18,539,824&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,148.5&nbsp;&nbsp;&nbsp;&nbsp; 10,147.7<br />redo subscn max counts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,830&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0<br />redo synch time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 109,173&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 59.8<br />redo synch writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8,489&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.7<br />redo wastage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,431,180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 675.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,330.7<br />redo write time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86,227&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47.2<br />redo writer latching time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />redo writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>8,936</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.9<br />......<br />sorts (disk)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />sorts (memory)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 558,140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 155.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 305.5<br />sorts (rows)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18,638,004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,175.8&nbsp;&nbsp;&nbsp;&nbsp; 10,201.4<br />......<br />transaction rollbacks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />transaction tables consistent rea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />transaction tables consistent rea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />undo change vector size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6,314,760&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,753.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,456.4<br />user I/O wait time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,308,751&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 363.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 716.3<br />user calls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,128,699&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,424.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,807.2<br />user commits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,816&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0<br />user rollbacks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />workarea executions - onepass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />workarea executions - optimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 538,179&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 149.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 294.6<br />write clones created in backgroun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />write clones created in foregroun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------------------------------------------------------</p></blockquote><p>根据统计信息可以计算平均日志写大小：</p><blockquote><p>avg.redo write size = ( Redo block written/redo writes )*512 bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ( 42,942/8,936 )*512<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2.4KB<br />这个平均值过小了，说明系统提交过于频繁。</p></blockquote><p>等待事件柱状图如下：</p><blockquote><p>Wait Event Histogram&nbsp; DB/Inst: CCDB/ccdb&nbsp; Snaps: 22-23<br />-&gt; Total Waits - units: K is 1000, M is 1000000, G is 1000000000<br />-&gt; % of Waits - column heading: &lt;=1s is truly &lt;1024ms, &gt;1s is truly &gt;=1024ms<br />-&gt; % of Waits - value: .0 indicates value was &lt;.05%, null is truly 0<br />-&gt; Ordered by Event (idle events last)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Total ----------------- % of Waits ------------------<br />Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits&nbsp; &lt;1ms&nbsp; &lt;2ms&nbsp; &lt;4ms&nbsp; &lt;8ms &lt;16ms &lt;32ms&nbsp; &lt;=1s&nbsp;&nbsp; &gt;1s<br />-------------------------- ----- ----- ----- ----- ----- ----- ----- ----- -----<br />......<br />control file parallel writ 1189&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0&nbsp; 53.1&nbsp; 37.0&nbsp;&nbsp; 7.9<br />control file sequential re 5059&nbsp;&nbsp; 99.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .0&nbsp;&nbsp;&nbsp; .1&nbsp;&nbsp;&nbsp; .0&nbsp;&nbsp;&nbsp; .1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .0<br />cursor: mutex X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 292&nbsp;&nbsp; 96.6&nbsp;&nbsp;&nbsp; .7&nbsp;&nbsp;&nbsp; .3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .7&nbsp;&nbsp;&nbsp; .3&nbsp;&nbsp; 1.4<br />cursor: pin S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 476&nbsp;&nbsp; 70.2&nbsp;&nbsp; 2.9&nbsp;&nbsp; 7.4&nbsp;&nbsp; 7.6&nbsp;&nbsp; 5.7&nbsp;&nbsp; 5.5&nbsp;&nbsp;&nbsp; .8<br />cursor: pin S wait on X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23&nbsp;&nbsp;&nbsp; 4.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.3&nbsp; 82.6&nbsp;&nbsp; 8.7<br />db file parallel read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50.0<br />db file scattered read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 116&nbsp;&nbsp; 18.1&nbsp;&nbsp; 7.8&nbsp; 15.5&nbsp; 32.8&nbsp; 14.7&nbsp;&nbsp; 9.5&nbsp;&nbsp; 1.7<br />db file sequential read&nbsp;&nbsp;&nbsp;&nbsp; 249K&nbsp; 23.0&nbsp;&nbsp; 3.1&nbsp; 11.4&nbsp; 28.1&nbsp; 15.3&nbsp;&nbsp; 7.6&nbsp; 10.9&nbsp;&nbsp;&nbsp; .7<br />......<br />log file parallel write&nbsp;&nbsp;&nbsp; 8935&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .1&nbsp;&nbsp; 2.7&nbsp; 14.6&nbsp; 26.9&nbsp; 20.7&nbsp; 33.3&nbsp;&nbsp; 1.6<br />log file sequential read&nbsp;&nbsp;&nbsp;&nbsp; 49&nbsp;&nbsp; 16.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 63.3&nbsp;&nbsp; 6.1&nbsp; 10.2&nbsp;&nbsp; 4.1<br />log file single write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50.0&nbsp; 50.0<br />log file switch completion&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100.0<br />log file sync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9128&nbsp;&nbsp;&nbsp; 1.9&nbsp;&nbsp;&nbsp; .4&nbsp;&nbsp; 7.2&nbsp;&nbsp; 9.3&nbsp; 23.6&nbsp; 17.1&nbsp; 40.5</p></blockquote><p>从等待事件柱状图，也可以明显地看到I/O竞争导致了性能问题。</p><p>&nbsp;<p><strong><font size="4">3. log file single write</font></strong><br /><strong>该事件仅与写日志文件头块相关，通常发生在增加新的组成员和增进序列号（log switch）时。</strong>头块写单个进行，因为头块的部分信息是文件号，每个文件不同。<p>更新日志文件头这个操作在后台完成，一般很少出现等待，无需太多关注。在log switch的过程中，LGWR需要改写日志文件头，有时可以观察到该等待事件的增加：</p><blockquote><p>sys@CCDB&gt; select event,time_waited from v$system_event where event = 'log file single write';<br />EVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIME_WAITED<br />---------------------------------------- -----------<br />log file single write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5541</p><p>sys@CCDB&gt; alter system switch logfile;<br />System altered.<p>sys@CCDB&gt; alter system switch logfile;<br />System altered.<p>sys@CCDB&gt; select event,time_waited from v$system_event where event = 'log file single write';<br />EVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIME_WAITED<br />---------------------------------------- -----------<br />log file single write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5546</p></blockquote><p>&nbsp;</p><p><strong><font size="4">4. log file parallel write<br /></font>从log buffer写redo记录到日志文件，主要指常规写操作（相对于log file sync）。</strong>如果每个日志组存在多个组成员，当flush log buffer时，写操作是并行的，这时此等待事件可能出现。</p><p>尽管这个写操作并行处理，直到所有I/O操作完成该写操作才会完成（如果磁盘支持异步IO或者使用IO SLAVE，那么即使只有一个redo log file member，也有可能出现此等待）。<strong>这个参数和log file sync时间相比较可以用来衡量log file的写入成本，通常称为同步成本率。</strong><p>&nbsp;<p><strong><font size="4">5. log Buffer Space - 日志缓冲空间<br /></font>当数据库产生日志的速度比LGWR的写出速度快，或者是当日志切换（log switch）太慢时，就会发生这种等待。</strong>这个等待出现时，通常表明redo log buffer过小，为解决这个问题，可以考虑增大日志文件的大小，或者增加日志缓冲区的大小。<p>另外一个可能的原因是磁盘I/O存在瓶颈，可以考虑使用写入速度更快的磁盘。在允许的条件下，可以考虑使用裸设备来存放日志文件，提高写入效率。在一般的系统中，最低的标准是，不要把日志文件和数据文件存放在一起，因为通常日志文件只写不读，分离存放可以获得性能提升，尽量使用RAID10而不是RAID5磁盘来存储日志文件。<p>Log Buffer Space等待事件出现时，数据库将陷入停顿状态，所有和日志生成相关的操作全部不能进行，所以这个等待事件应该引起充分的重视。<p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/05/event-about-log.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>direct path read/write （直接路径读／写）</title><link>http://www.dbtan.com/2010/04/direct-path-readwrite.html</link> <comments>http://www.dbtan.com/2010/04/direct-path-readwrite.html#comments</comments> <pubDate>Mon, 12 Apr 2010 07:06:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category> <category><![CDATA[重要等待事件]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/04/direct-path-readwrite.html</guid> <description><![CDATA[direct path read/write （直接路径读／写）： 直接路径读（direct path read）通常发生在Oracle直接读数据到进程PGA时，这个读取不需要经过SGA。直接路径读等待事件的3个参数分别是file number（指绝对文件号）、first dba、block cnt数量。在Oracle 10g/11g中，这个等待事件被归于User I/O一类。 db file sequential read、db file scattered read、direct path read是常见的集中数据读方式，下图简要描述了这3种方式的读取示意。 &#160; 这类读取通常在以下情况被使用：·磁盘排序IO操作；·并行查询从属进程；·预读操作。 最为常见的是第一种情况。在DSS系统中，存在大量的direct path read是很正常的，但是在OLTP系统中，通常显著的直接路径读（direct path read）都意味着系统应用存在问题，从而导致大量的磁盘排序读取操作。 直接路径写（direct paht write）通常发生在Oracle直接从PGA写数据到数据文件或临时文件，这个写操作可以绕过SGA。直接路径写等待事件的3个参数分别是：file number（指绝对文件号）、first dba和block cnt数量，在Oracle 10g/11g中，这个等待事件同direct path read一样被归于User I/O一类。 这类写入操作通常在以下情况被使用：·直接路径加载；·并行DML操作；·磁盘排序；·对未缓存的“LOB”段的写入，随后会记录为direct path write(lob)等待。 最为常见的直接路径写，多数因为磁盘排序导致。对于这一写入等待，我们应该找到I/O操作最为频繁的数据文件（如果有过多的排序操作，很有可能就是临时文件），分散负载，加快其写入操作。 1. 磁盘排序诊断：如果系统存在过多的磁盘排序，会导致临时表空间操作频繁，对于这种情况，可以考虑为不同用户分配不同的临时表空间，使用多个临时文件，写入不同磁盘或者裸设备，从而降低竞争，提高性能；对于Oracle 8i的数据库，应该考虑使用本地管理（Local）的临时表空间，而不是字典（dictionary）管理。 对于这种情况，在Oracle 9i之前，可以适当增加sort_area_size的大小；从Oracle 9i开始，可以适当增大pga_aggregate_target，以缩减磁盘排序对于磁盘的写入，从而提高系统及应用响应。但是通常应该及时检查应用，确认是否因为应用问题导致了过度排序，从而根本上解决问题。 2. 并行查询导致性能问题：有时候在应用系统中，不正确的使用并行查询也会导致应用问题。Statspack的Top 5时间事件输出显示direct path read消耗了较高的等待时，而内存排序率很高甚至是100%（In-memory Sort %:100.00）显然这里的Direct [...]]]></description> <content:encoded><![CDATA[<p>direct path read/write （直接路径读／写）：<p><strong>直接路径读（direct path read）通常发生在Oracle直接读数据到进程PGA时，这个读取不需要经过SGA。</strong>直接路径读等待事件的3个参数分别是file number（指绝对文件号）、first dba、block cnt数量。在Oracle 10g/11g中，这个等待事件被归于User I/O一类。<p>db file sequential read、db file scattered read、direct path read是常见的集中数据读方式，下图简要描述了这3种方式的读取示意。<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DB file Sequential Read" border="0" alt="DB file Sequential Read" src="http://dbtan.com/dbtan/blog_pic/directpathreadwritedirectpathreadwrite_C556/clip_image005.gif" width="145" height="254"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DB file Scattered Read" border="0" alt="DB file Scattered Read" src="http://dbtan.com/dbtan/blog_pic/directpathreadwritedirectpathreadwrite_C556/clip_image004.gif" width="127" height="254"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Direct Path Read" border="0" alt="Direct Path Read" src="http://dbtan.com/dbtan/blog_pic/directpathreadwritedirectpathreadwrite_C556/clip_image0044.gif" width="122" height="195">&nbsp;<p>这类读取通常在以下情况被使用：<br />·磁盘排序IO操作；<br />·并行查询从属进程；<br />·预读操作。<p>最为常见的是第一种情况。在DSS系统中，存在大量的direct path read是很正常的，但是在OLTP系统中，通常显著的直接路径读（direct path read）都意味着系统应用存在问题，从而导致大量的磁盘排序读取操作。<p><strong>直接路径写（direct paht write）通常发生在Oracle直接从PGA写数据到数据文件或临时文件，这个写操作可以绕过SGA。</strong>直接路径写等待事件的3个参数分别是：file number（指绝对文件号）、first dba和block cnt数量，在Oracle 10g/11g中，这个等待事件同direct path read一样被归于User I/O一类。<p>这类写入操作通常在以下情况被使用：<br />·直接路径加载；<br />·并行DML操作；<br />·磁盘排序；<br />·对未缓存的“LOB”段的写入，随后会记录为direct path write(lob)等待。<p>最为常见的直接路径写，多数因为磁盘排序导致。对于这一写入等待，我们应该找到I/O操作最为频繁的数据文件（如果有过多的排序操作，很有可能就是临时文件），分散负载，加快其写入操作。<p><strong><font size="4">1. 磁盘排序诊断：</font></strong><br />如果系统存在过多的磁盘排序，会导致临时表空间操作频繁，对于这种情况，可以考虑为不同用户分配不同的临时表空间，使用多个临时文件，写入不同磁盘或者裸设备，从而降低竞争，提高性能；对于Oracle 8i的数据库，应该考虑使用本地管理（Local）的临时表空间，而不是字典（dictionary）管理。<p>对于这种情况，在Oracle 9i之前，可以适当增加sort_area_size的大小；从Oracle 9i开始，可以适当增大pga_aggregate_target，以缩减磁盘排序对于磁盘的写入，从而提高系统及应用响应。但是通常应该及时检查应用，确认是否因为应用问题导致了过度排序，从而根本上解决问题。<p><strong><font size="4">2. 并行查询导致性能问题：</font></strong><br />有时候在应用系统中，不正确的使用并行查询也会导致应用问题。Statspack的Top 5时间事件输出显示direct path read消耗了较高的等待时，而内存排序率很高甚至是100%（In-memory Sort %:100.00）显然这里的Direct Path Read并不是由于排序引发的，注意到另外一个等待事件（KJC: Wait for msg sends to complete）和并行有关，所以初步判断这里的direct path read可能和并行有关。</p><blockquote><p>&nbsp;&nbsp;&nbsp; 注：在Statspack的报告中，存在一个性能指标，称为内存排序率（In-memory Sort Ratio），用于衡量系统的排序操作，这个指标就是由两个统计信息sorts (disk)和sorts (memory)得出：<br /><em><strong>&nbsp;&nbsp;&nbsp; In-memory Sort Ratio = sorts (memory) / [sorts (disk) + sorts (memory)] </strong></em></p></blockquote><p>进一步检查Statspack报告中的SQL部分，发现大量并行查询改写出来的SQL，这些SQL通过内部提示（Hints）固化其执行路径。<p>在很多情况下，并行也许并不是最好的选择，如果表并不大，并行反而会降低其执行速度。<p><strong>通过查询dba_tables字典表可以获得degree并行度的记录，并行度大于1的数据表在查询时会启用并行</strong>，但是注意事实还会有所不同，degree字段的类型及长度是VARCHAR2(10)。所以注意，当使用类似查询时，可能无法获得返回值：</p><blockquote><p>sys@CCDB&gt; select table_name from dba_tables where degree = '1' or degree = 'DEFAULT';<br />no rows selected</p></blockquote><p>我们看一下degree以及instances的记录方式：</p><blockquote><p>sys@CCDB&gt; select degree,length(degree) from dba_tables group by degree;<br />DEGREE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LENGTH(DEGREE)<br />--------------- --------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />sys@CCDB&gt; select instances,length(instances) from dba_tables group by instances;<br />INSTANCES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LENGTH(INSTANCES)<br />--------------- -----------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10</p></blockquote><p>degreee和instances实际上记录了10个字符，左端用空格补齐。在dba_tables的创建语句中，可以找到根本原因，以下是这两个字段的定义来源：</p><blockquote><p>&nbsp;&nbsp;&nbsp; lpad(decode(t.degree, 32767, 'DEFAULT', nvl(t.degree,1)),10),<br />&nbsp;&nbsp;&nbsp; lpad(decode(t.instances, 32767, 'DEFAULT', nvl(t.instances,1)),10),</p></blockquote><p><strong>而需要注意的是，如果degree设置为DEFAULT，则默认数据库会对该表启用并行。 </strong><p>最后找到相关的SQL，从AUTOTRACE可以看到这些SQL的执行计划，查看涉及数据表的并行度，注意是否有被设置为DEFAULT的表。<p>将表的并行度修改为1后，问题得以解决：</p><blockquote><p>alter table &lt;table_name&gt; parallel 1;</p></blockquote><p>这个问题给我们的启示是：并行并不总是能够到来性能提升。<p><strong><font size="4">3. 磁盘排序与临时文件：</font></strong><br />在Oracle 10g/11g中，为了区分特定的对于临时文件的直接读写操作，Oracle对direct path read/write进行了分离，将这类操作分列出来：</p><blockquote><p>sys@CCDB&gt; select event#,name,wait_class<br />&nbsp; 2&nbsp; from v$event_name<br />&nbsp; 3&nbsp; where name like 'direct%';<br />&nbsp;&nbsp;&nbsp; EVENT# NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_CLASS<br />---------- ------------------------- ---------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 177 direct path read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User I/O<br /><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 178 direct path read temp&nbsp;&nbsp;&nbsp;&nbsp; User I/O</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 179 direct path write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User I/O<br /><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 180 direct path write temp&nbsp;&nbsp;&nbsp; User I/O </strong></p></blockquote><p>可以看到，现在的<strong>direct path read/write temp</strong>就是单指对于临时文件的直接读写操作。结合Oracle 10g的一些特性，来进一步研究一下直接路径读／写与临时文件。<br />首先在一个session中执行一个能够引发磁盘排序的查询：</p><blockquote><p>tq@CCDB&gt; select sid from v$mystat where rownum &lt;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID<br />----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1066<br />tq@CCDB&gt; select a.table_name,b.object_name,b.object_type<br />&nbsp; 2&nbsp; from t1 a,t2 b<br />&nbsp; 3&nbsp; where a.table_name = b.object_name<br />&nbsp; 4&nbsp; order by b.object_name,b.object_type;</p></blockquote><p>在另外sessoin查询相应等待事件：</p><blockquote><p>tq@CCDB&gt; select event,p1text,p1,p2text,p2,p3text,p3<br />&nbsp; 2&nbsp; from v$session_wait_history<br />&nbsp; 3&nbsp; where sid = 1066;<br />EVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1 P2TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P2 P3TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P3<br />------------------------ ------------- ------- ------------ ------- ------------ -------<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 313512 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 313481 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 386887 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 317736 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 317193 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 316646 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 316134 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 315622 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 315079 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />direct path read temp&nbsp;&nbsp;&nbsp; file number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 201 first dba&nbsp;&nbsp;&nbsp;&nbsp; 314567 block cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31<br />10 rows selected.</p></blockquote><p>从以上输出可以看到最近10次等待，direct path read temp就是这个查询引起的磁盘排序。<strong>注意这里的file number为201</strong>。而实际上，通过v$tempfile来查询，临时文件的文件号仅为1：</p><blockquote><p>tq@CCDB&gt; select file#,name from v$tempfile;<br />&nbsp;&nbsp;&nbsp;&nbsp; FILE# NAME<br />---------- -----------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 /oracle/oradata/ccdb/ccdb/temp01.dbf</p></blockquote><p>如果通过10046事件跟踪，也可以获得类似的结果：</p><blockquote><p>WAIT #3: nam='direct path write temp' ela= 1 file number=201 first dba=437862 block cnt=31 obj#=112141 tim=1270780<br />330976998<br />WAIT #3: nam='direct path write temp' ela= 1 file number=201 first dba=437416 block cnt=31 obj#=112141 tim=1270780<br />330977070<br />WAIT #3: nam='direct path read temp' ela= 7 file number=201 first dba=438471 block cnt=31 obj#=112141 tim=12707803<br />30982214<br />WAIT #3: nam='direct path read temp' ela= 4 file number=201 first dba=438502 block cnt=31 obj#=112141 tim=12707803<br />30983765<br />WAIT #3: nam='direct path read temp' ela= 8 file number=201 first dba=387015 block cnt=31 obj#=112141 tim=12707803<br />30993872</p></blockquote><p>在Oracle文档中，file#被定义为绝对文件号（The Absolute File Number）。这里的原因何在呢？研究这个问题要先研究一下<strong><font size="4">v$tempseg_usage</font></strong>这个视图，可以从这个视图出发动手研究一下这个对象究竟来自何方。<p>查询dba_objects视图，发现v$tempseg_usage原来是一个同义词。</p><blockquote><p>sys@CCDB&gt; select object_type from dba_objects where object_name = 'V$TEMPSEG_USAGE'; <br />OBJECT_TYPE<br />-------------------<br />SYNONYM</p></blockquote><p>再追本溯源原来v$tempseg_usage是v_$sort_usage的同义词，也就是和v$sort_usage同源。从Oracle 9i开始，Oracle将v$sort_usage视图从文档中移除了，因为这个名称有所歧义，容易使人误解仅记录排序内容，所以v$tempseg_usage视图被引入，用于记录临时段的使用情况：</p><blockquote><p>sys@CCDB&gt; select * from dba_synonyms where synonym_name = 'V$TEMPSEG_USAGE';<br />OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYNONYM_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE_OWNER&nbsp;&nbsp;&nbsp;&nbsp; TABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB_LINK<br />---------- -------------------- --------------- --------------- ----------<br />PUBLIC&nbsp;&nbsp;&nbsp;&nbsp; V$TEMPSEG_USAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V_$SORT_USAGE</p></blockquote><p>如果再进一步，可以看到这个视图的构建语句：</p><blockquote><p>sys@CCDB&gt; select view_definition from v$fixed_view_definition <br />&nbsp; 2&nbsp; where view_name = 'GV$SORT_USAGE';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />VIEW_DEFINITION<br />--------------------------------------------------------------------------------<br />select x$ktsso.inst_id, username, username, ktssoses, ktssosno, prev_sql_addr, p<br />rev_hash_value, prev_sql_id, ktssotsn, decode(ktssocnt, 0, 'PERMANENT', 1, 'TEMP<br />ORARY'), decode(ktssosegt, 1, 'SORT', 2, 'HASH', 3, 'DATA', 4, 'INDEX', 5, 'LOB_<br />DATA', 6, 'LOB_INDEX' , 'UNDEFINED'), ktssofno, ktssobno, ktssoexts, ktssoblks,<br />ktssorfno from x$ktsso, v$session where ktssoses = v$session.saddr and ktssosno<br />= v$session.serial#</p></blockquote><p>格式化一下，v$sort_usage的创建语句如下：</p><blockquote><p>SELECT&nbsp;&nbsp; x$ktsso.inst_id,username,username,ktssoses,ktssosno,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prev_sql_addr,prev_hash_value,prev_sql_id,ktssotsn,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (ktssocnt,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,'PERMANENT',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,'TEMPORARY'),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (ktssosegt,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 'SORT',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, 'HASH',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3, 'DATA',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4, 'INDEX',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5, 'LOB_DATA',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6, 'LOB_INDEX',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'UNDEFINED'),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#8000ff">ktssofno</font></strong>,ktssobno,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ktssoexts,ktssoblks,ktssorfno<br />&nbsp; FROM&nbsp;&nbsp; <strong><font color="#8000ff">x$ktsso</font></strong>, v$session<br /> WHERE&nbsp;&nbsp; ktssoses = v$session.saddr AND ktssosno = v$session.serial#;</p></blockquote><p><strong>注意到在Oracle文档中对<font color="#0080ff">v$sort_usage</font>字段<font color="#0080ff">SEGFILE#</font>的定义为：</strong></p><blockquote><p><font color="#0080ff">SEGFILE#&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File number of initial extent </font></p></blockquote><p>&nbsp;</p><p><strong>在视图中，这个字段来自<font color="#8000ff">x$ktsso.ktssofno</font>，也就是说这个字段实际上代表的是绝对文件号</strong>。那么这个绝对文件号如何与临时文件关联呢？能否与v$tempfile中的file#字段关联呢？<p>再来看一下<strong><font size="4">v$tempfile</font></strong>的来源，v$tempfile由如下语句创建：</p><blockquote><p>sys@CCDB&gt; select view_definition from v$fixed_view_definition<br />&nbsp; 2&nbsp; where view_name = 'GV$TEMPFILE';<br />VIEW_DEFINITION<br />--------------------------------------------------------------------------------<br />select tf.inst_id, tf.tfnum, to_number(tf.tfcrc_scn), to_date(tf.tfcrc_tim,'MM/D<br />D/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'), tf.tftsn, tf.tfrfn, decode(bitand(tf<br />.tfsta, 2),0,'OFFLINE',2,'ONLINE','UNKNOWN'), decode(bitand(tf.tfsta, 12), 0,'DI<br />SABLED',4, 'READ ONLY', 12, 'READ WRITE',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'UNKNOWN'), fh.fhtmpfsz*tf.tfbsz, fh.fhtmpfsz,&nbsp; tf.tf<br />csz*tf.tfbsz,tf.tfbsz, fn.fnnam&nbsp; from x$kcctf tf, x$kccfn fn, x$kcvfhtmp fh&nbsp; whe<br />re fn.fnfno=tf.tfnum and fn.fnfno=fh.htmpxfil and tf.tffnh=fn.fnnum&nbsp; and tf.tfdu<br />p!=0 and bitand(tf.tfsta, 32) &lt;&gt; 32&nbsp; and fn.fntyp=7 and fn.fnnam is not null</p></blockquote><p>格式化v$tempfile如下：</p><blockquote><p>SELECT&nbsp;&nbsp; tf.inst_id,tf.tfnum,TO_NUMBER (tf.tfcrc_scn),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TO_DATE (tf.tfcrc_tim,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tf.tftsn,tf.tfrfn,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (BITAND (tf.tfsta, 2), 0, 'OFFLINE', 2, 'ONLINE', 'UNKNOWN'),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE (BITAND (tf.tfsta, 12),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, 'DISABLED',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4, 'READ ONLY',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12, 'READ WRITE',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'UNKNOWN'),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fh.fhtmpfsz * tf.tfbsz,fh.fhtmpfsz,tf.tfcsz * tf.tfbsz,tf.tfbsz,fn.fnnam<br />&nbsp; FROM&nbsp;&nbsp; <strong><font color="#ff8080">x$kcctf</font></strong> tf, x$kccfn fn, x$kcvfhtmp fh<br /> WHERE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fn.fnfno = tf.tfnum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND fn.fnfno = fh.htmpxfil<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND tf.tffnh = fn.fnnum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND tf.tfdup != 0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND BITAND (tf.tfsta, 32) &lt;&gt; 32<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND fn.fntyp = 7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND fn.fnnam IS NOT NULL;</p></blockquote><p><strong><font color="#ff8000" size="4">考察x$kcctf底层表</font>，注意到<font color="#ff8080">TFAFN</font>（Temp File Absolute File Number）在这里存在</strong>：</p><blockquote><p>sys@CCDB&gt; desc x$kcctf<br /> Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp; Type<br /> ---------------- -------- ----------------<br /> ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW(8)<br /> INDX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> INST_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /><strong><font color="#008000"> TFNUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER</font></strong><br /><strong><font color="#ff8080"> TFAFN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER</font></strong><br /> TFCSZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFBSZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFSTA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFCRC_SCN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(16)<br /> TFCRC_TIM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(20)<br /> TFFNH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFFNT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFDUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFTSN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFTSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFRFN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFPFT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFMSZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br /> TFNSZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER</p></blockquote><p>而这个字段在构建v$tempfile时并未出现，所以不能通过v$sort_usage和v$tempfile直接关联绝对文件号。可以简单构建一个排序段使用，然后来继续研究一下：</p><blockquote><p>sys@CCDB&gt; select username,segtype,<strong><font color="#ff8080">segfile#</font></strong>,segblk#,extents,segrfno# from <strong><font color="#ff8080">v$sort_usage</font></strong>;<br />USERNAME&nbsp;&nbsp;&nbsp;&nbsp; SEGTYPE&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#ff8080">SEGFILE#</font></strong>&nbsp;&nbsp;&nbsp; SEGBLK#&nbsp;&nbsp;&nbsp; EXTENTS&nbsp;&nbsp; SEGRFNO#<br />------------ --------- ---------- ---------- ---------- ----------<br />SYS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOB_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#ff8080">201</font></strong>&nbsp;&nbsp;&nbsp;&nbsp; 340361&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</p></blockquote><p>看到这里的<strong><font color="#ff8080">SEGFILE#=201</font></strong>，而在v$tempfile是找不到这个信息的：</p><blockquote><p>sys@CCDB&gt; select <strong><font color="#008000">file#</font></strong>,rfile#,ts#,status,blocks from <strong><font color="#008000">v$tempfile</font></strong>;<br />&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#008000">FILE#</font></strong>&nbsp;&nbsp;&nbsp;&nbsp; RFILE#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TS# STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS<br />---------- ---------- ---------- ------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#008000">1</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 ONLINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 443520</p></blockquote><p><strong>但是可以从x$kcctf中获得这些信息，<font color="#008000">v$tempfile.file#实际上来自</font><font color="#ff8000" size="4">x$kcctf.</font><font color="#008000">tfnum，是临时文件的文件号</font>；<font color="#ff8080">而绝对文件号是<font size="4"><font color="#ff8000">x$kcctf</font>.</font>tfafn，这个字段才可以与<font color="#0080ff">v$sort_usage.segfile#</font>关联</font></strong>：</p><blockquote><p>sys@CCDB&gt; select indx,<font color="#008000"><strong>tfnum</strong></font>,<strong><font color="#ff8080">tfafn</font></strong>,tfcsz from <font color="#ff8080"><strong>x$kcctf</strong></font>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#008000">TFNUM</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#ff8080">TFAFN</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TFCSZ<br />---------- ---------- ---------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#008000">1</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#ff8080">201</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2560</p></blockquote><p>再进一步可以知道，实际上，为了分离临时文件号和数据文件号，<strong>Oracle对临时文件的编号以db_files为起点，所以临时文件的绝对文件号应该等于<font size="4">db_files+file#</font></strong>。<p><strong>db_files参数的缺省值为200：</strong></p><blockquote><p>sys@CCDB&gt; show parameter db_files<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />------------- -------------- -----------<br />db_files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200<br />sys@CCDB&gt; select file#,name from v$tempfile;<br />&nbsp;&nbsp;&nbsp;&nbsp; FILE# NAME<br />---------- ---------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 /oracle/oradata/ccdb/ccdb/temp01.dbf</p></blockquote><p>所以在Oracle文档中v$tempfile.file#被定义为The absolute file number是不确切的。</p><p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-sequential-read.html" title="db file sequential read （数据文件顺序读取）">db file sequential read （数据文件顺序读取）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/04/direct-path-readwrite.html/feed</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>db file scattered read 等待事件</title><link>http://www.dbtan.com/2010/04/db-file-scattered-read.html</link> <comments>http://www.dbtan.com/2010/04/db-file-scattered-read.html#comments</comments> <pubDate>Sat, 10 Apr 2010 15:24:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category> <category><![CDATA[重要等待事件]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/04/db-file-scattered-read.html</guid> <description><![CDATA[db file scattered read 等待事件： 我们经常会见到db file scattered read等待事件，在生产环境中，这个等待事件可能更为常见。这个事件表明用户进程正在读数据到Buffer Cache中，等待直到I/O调用返回。db file scattered read发出离散读，将存储上连接的数据块离散的读入到多个不连续的内存位置。Scattered Read通常是多块读，在Full Table Scan或Fast Full Scan等访问方式下使用。 Scattered Read代表Full Scan，当执行Full Scan读取数据到Buffer Cache时，通常连续的数据在内存中的存储位置并不连续，所以这个等待被命名为Scattered Read（离散读）。每次多块读读取的数据块数量受初始化参数DB_FILE_MULTIBLOCK_READ_COUNT限制。下图简要说明了Scattered Read的数据读取方式。 从v$event_name视图可以看到，该等待有3个参数，分别代表文件号、起始数据块号、数据块的数量： sys@CCDB&#62; select event#,name,parameter1,parameter2,parameter3 &#160; 2&#160; from v$event_name&#160; 3&#160; where name = 'db file scattered read'; &#160;&#160;&#160; EVENT# NAME&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PARAMETER1&#160;&#160; PARAMETER2&#160;&#160; PARAMETER3---------- ------------------------------ ------------ ------------ ------------&#160;&#160;&#160;&#160;&#160;&#160; 132 db file scattered [...]]]></description> <content:encoded><![CDATA[<p>db file scattered read 等待事件：<p>我们经常会见到<strong><font size="4">db file scattered read</font></strong>等待事件，在生产环境中，这个等待事件可能更为常见。这个事件表明用户进程正在读数据到Buffer Cache中，等待直到I/O调用返回。db file scattered read发出离散读，将存储上连接的数据块离散的读入到多个不连续的内存位置。<strong>Scattered Read通常是多块读，在Full Table Scan或Fast Full Scan等访问方式下使用</strong>。<p><strong>Scattered Read代表Full Scan，当执行Full Scan读取数据到Buffer Cache时，通常连续的数据在内存中的存储位置并不连续，所以这个等待被命名为Scattered Read（离散读）。每次多块读读取的数据块数量受初始化参数DB_FILE_MULTIBLOCK_READ_COUNT限制</strong>。下图简要说明了Scattered Read的数据读取方式。<p><a href="http://dbtan.com/dbtan/blog_pic/dbfilescatteredreaddbfilescatteredread_14616/clip_image004.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Scattered Read的数据读取" border="0" alt="Scattered Read的数据读取" align="right" src="http://dbtan.com/dbtan/blog_pic/dbfilescatteredreaddbfilescatteredread_14616/clip_image004_thumb.gif" width="127" height="254"></a><p>从v$event_name视图可以看到，该等待有3个参数，分别代表文件号、起始数据块号、数据块的数量：</p><blockquote><p>sys@CCDB&gt; select event#,name,parameter1,parameter2,parameter3 <br />&nbsp; 2&nbsp; from v$event_name<br />&nbsp; 3&nbsp; where name = 'db file scattered read'; <br />&nbsp;&nbsp;&nbsp; EVENT# NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARAMETER1&nbsp;&nbsp; PARAMETER2&nbsp;&nbsp; PARAMETER3<br />---------- ------------------------------ ------------ ------------ ------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 132 db file scattered read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; block#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blocks</p></blockquote><p>数据文件号、起始数据号加上数据块的数量，通过这些信息可以知道Oracle Session正在等待的对象文件等信息。该等待可能和全表扫描（Full Table Scan）或者快速全索引扫描（Index Fast Full Scan）的连续读取相关，根据经验，通常大量的db file scattered read等待可能意味着应用问题或者索引缺失。<p>在实际环境的诊断过程中，可以通过v$session_wait视图发现session的等待，再结合其他视图找到存在问题的SQL等根本原因，从而从根本上解决问题。<p>当这个等待事件比较显著时，用户也可以结合<strong>v$session_longops</strong>动态性能视图来进行诊断，<strong>该视图中记录了长时间（运行时间超过6秒的）运行的事务</strong>，可能很多是全表扫描操作（不管怎样，这部分信息都是值得我们注意的）。<p>从Oracle 9i开始，Oracle新增加了一个视图v$sql_plan用于记录当前系统Library Cache中SQL语句的执行计划，可以通过这个视图找到存在问题的SQL语句。<p>可以过程v$sql_plan和v$sqltext联合，获得这些查询的SQL语句，<strong>查找全表扫描的SQL语句</strong>可以参考如下语句：</p><blockquote><p>select sql_text <br />from v$sqltext t,v$sql_plan p<br />where t.hash_value = p.hash_value<br />&nbsp; and p.operation = 'TABLE ACCESS'<br />&nbsp; and p.options = 'FULL'<br />order by p.hash_value,t.piece；</p></blockquote><p><strong>查找Fast Full Index扫描的SQL语句</strong>可以参考如下语句：</p><blockquote><p>select sql_text<br />from v$sqltext t, v$sql_plan p<br />where t.hash_value = p.hash_value<br />&nbsp; and p.operation = 'INDEX'<br />&nbsp; and p.options = 'FULL SCAN'<br />order by p.hash_value, t.piece；</p></blockquote><p>这些信息对于发现数据库问题，优化数据库性能具有极强的指导意义。<p>在Oracle 10g中，Oracle对等待事件进行了分类，<strong>db file scattered read事件被归入User I/O一类</strong>：</p><blockquote><p>sys@CCDB&gt; select name,parameter1 p1,parameter2 p2,parameter3 p3,<br />&nbsp; 2&nbsp; wait_class_id,wait_class#,wait_class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; 3&nbsp; from v$event_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; 4&nbsp; where name = 'db file scattered read';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS<br />------------------------- ---------- ---------- ---------- ------------- ----------- ------------<br />db file scattered read&nbsp;&nbsp;&nbsp; file#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; block#&nbsp;&nbsp;&nbsp;&nbsp; blocks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1740759767&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 User I/O</p></blockquote><p>完成对等待事件的分类之后，Oracle 10g的ADDM可以很容易地通过故障分析定位到问题所在，帮助用户快速发现数据库的瓶颈及瓶颈的根源，这就是Oracle的ADDM专家系统的设计思想。<p>通过下图可以直观清晰地看到这个等待模型和ADDM结合实现的Oracle专家诊断系统。<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Oracle专家诊断系统" border="0" alt="Oracle专家诊断系统" src="http://dbtan.com/dbtan/blog_pic/dbfilescatteredreaddbfilescatteredread_14616/clip_image002.jpg" width="452" height="298"></p><p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-sequential-read.html" title="db file sequential read （数据文件顺序读取）">db file sequential read （数据文件顺序读取）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/04/db-file-scattered-read.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>db file sequential read （数据文件顺序读取）</title><link>http://www.dbtan.com/2010/04/db-file-sequential-read.html</link> <comments>http://www.dbtan.com/2010/04/db-file-sequential-read.html#comments</comments> <pubDate>Sat, 10 Apr 2010 15:02:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category> <category><![CDATA[重要等待事件]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/04/db-file-sequential-read.html</guid> <description><![CDATA[db file sequential read （数据文件顺序读取）： db file sequential read是个非常常见的I/O相关的等待事件，通常显示与单个数据块相关的读取操作，在大多数的情况下，读取一个索引块或者通过索引读取一个数据块时，都会记录这个等待。 这个等待事件有3个参数P1，P2，P3，其中P1代表Oracle要读取的文件的绝对文件号，P2代表Oracle从这个文件中开始读取的起始数据块号，P3代表读取的BLOCK数量，通常这个值为1，表明是道单个BLOCK被读取。 sys@CCDB&#62; select name,parameter1,parameter2,parameter3&#160; 2&#160; from v$event_name&#160; 3&#160; where name = 'db file sequential read';&#160;&#160;&#160; NAME&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PARAMETER1&#160;&#160;&#160;&#160;&#160; PARAMETER2&#160;&#160;&#160;&#160;&#160; PARAMETER3------------------------------ --------------- --------------- ---------------db file sequential read&#160;&#160;&#160;&#160;&#160;&#160;&#160; file#&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; block#&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; blocks 在Oracle 10g/11g中，这个等待事件被归入User I/0一类： sys@CCDB&#62; select name,wait_class&#160; 2&#160; from v$event_name&#160; 3&#160; where name = 'db file sequential read';NAME&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WAIT_CLASS&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description> <content:encoded><![CDATA[<p>db file sequential read （数据文件顺序读取）：<p><strong><font size="4">db file sequential read</font></strong>是个非常常见的I/O相关的等待事件，通常显示与单个数据块相关的读取操作，在大多数的情况下，读取一个索引块或者通过索引读取一个数据块时，都会记录这个等待。<p>这个等待事件有3个参数P1，P2，P3，其中P1代表Oracle要读取的文件的绝对文件号，P2代表Oracle从这个文件中开始读取的起始数据块号，P3代表读取的BLOCK数量，通常这个值为1，表明是道单个BLOCK被读取。</p><blockquote><p>sys@CCDB&gt; select name,parameter1,parameter2,parameter3<br />&nbsp; 2&nbsp; from v$event_name<br />&nbsp; 3&nbsp; where name = 'db file sequential read';&nbsp;&nbsp;&nbsp; <br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARAMETER1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARAMETER2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARAMETER3<br />------------------------------ --------------- --------------- ---------------<br />db file sequential read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; block#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blocks</p></blockquote><p>在Oracle 10g/11g中，这个等待事件<strong>被归入User I/0一类</strong>：</p><blockquote><p>sys@CCDB&gt; select name,wait_class<br />&nbsp; 2&nbsp; from v$event_name<br />&nbsp; 3&nbsp; where name = 'db file sequential read';<br />NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_CLASS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------------------ ------------------<br />db file sequential read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User I/O</p></blockquote><p>下图简要说明了单块读取的操作方式：<p><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="单块读取的操作" border="0" alt="单块读取的操作" align="left" src="http://dbtan.com/dbtan/blog_pic/dbfilesequentialreaddbfilesequentialread_14291/clip_image005.gif" width="145" height="254"><p>如果这个等待事件比较显著，可能表示在多表连接中，表的连接顺序存在问题，没有正确地使用驱动表；或者可能索引的使用存在问题，并非索引总是最好的选择。在大多数情况下，通过索引可以更为快速地获取记录，所以对于编码规范、调整良好的数据库，这个等待事件很大通常是正常的。有时候这个等待过高和存储分布不连续、连续数据块中部分被缓存有关，特别对于DML频繁的数据表，数据以及存储空间的不连续可能导致过量的单块读，定期的数据整理和空间回收有时候是必须的。<p>需要注意在很多情况下，使用索引并不是最佳的选择，比如读取较大表中大量的数据，全表扫描可能会明显快于索引扫描，所以在开发中就应该注意，对于这样的查询应该进行避免使用索引扫描。<p>从Oracle 9iR2开始，Oracle引入了段级统计信息收集的新特性，可以通过查询<strong><font size="4">v$segment_statistics</font></strong>视图，找出物理读显著的索引段或者是表段，研究其数据结构，看能否通过重建或者重新划分分区、存储参数等手段降低I/O访问。<p>Oracle 9iR2中，收集的统计信息共有11类：</p><blockquote><p>SQL&gt; select * from v$segstat_name; <br />STATISTIC# NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAMPLED <br />---------- ---------------------------------------- --------- <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 logical reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YES <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 buffer busy waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 db block changes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YES <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 physical reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 physical writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 physical reads direct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 physical writes direct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 global cache cr blocks served&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 global cache current blocks served&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 ITL waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 row lock waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO <br />11 rows selected.</p></blockquote><p>在Oracle 10gR2/11gR1中，这类统计信息增加为15个：</p><blockquote><p>sys@CCDB&gt; select * from v$segstat_name;<br />STATISTIC# NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAM<br />---------- ----------------------------------- ---<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 logical reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YES<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 buffer busy waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 gc buffer busy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 db block changes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YES<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 physical reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 physical writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 physical reads direct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 physical writes direct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 gc cr blocks received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 gc current blocks received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 ITL waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12 row lock waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14 space used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15 space allocated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17 segment scans&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO<br />15 rows selected.</p></blockquote><p>对于CBO模式下的数据库，应当及时收集统计信息，使SQL可以选择正确的执行计划，避免因为统计信息的陈旧而导致执行错误等。</p><p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li><li>2010/04/10 -- <a href="http://www.dbtan.com/2010/04/db-file-scattered-read.html" title="db file scattered read 等待事件">db file scattered read 等待事件</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/04/db-file-sequential-read.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>顶级等待事件</title><link>http://www.dbtan.com/2010/04/top-events.html</link> <comments>http://www.dbtan.com/2010/04/top-events.html#comments</comments> <pubDate>Sat, 10 Apr 2010 14:52:00 +0000</pubDate> <dc:creator>dbtan</dc:creator> <category><![CDATA[Oracle]]></category> <category><![CDATA[深入解析Oracle]]></category> <category><![CDATA[读书笔记]]></category> <category><![CDATA[Event]]></category><guid isPermaLink="false">http://www.dbtan.com/2010/04/top-events.html</guid> <description><![CDATA[顶级等待事件： 前文还提到另外一个重要视图v$system_event，该视图记录的是数据库自启动以来等待事件的汇总。通过查询该视图，就可以快速获得数据库等待事件的总体概况，了解数据库运行的基本状态： sys@CCDB&#62; select * &#160; 2&#160; from (select event,time_waited&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; from v$system_event&#160; 4&#160;&#160;&#160;&#160;&#160;&#160;&#160; order by time_waited desc)&#160; 5&#160; where rownum &#60; 11;EVENT&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TIME_WAITED---------------------------------------------------------------- -----------rdbms ipc message&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 6207605140DIAG idle wait&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1033906433virtual circuit status&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517841938dispatcher timer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517838356Streams AQ: qmn coordinator idle wait&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517837446Streams AQ: qmn slave idle wait&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517833505fbar timer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517818073smon timer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517784201pmon timer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 517766357Streams AQ: [...]]]></description> <content:encoded><![CDATA[<p>顶级等待事件：<p>前文还提到另外一个重要视图<strong><font size="4">v$system_event</font></strong>，该视图记录的是数据库自启动以来等待事件的汇总。通过查询该视图，就可以快速获得数据库等待事件的总体概况，了解数据库运行的基本状态：</p><blockquote><p>sys@CCDB&gt; select * <br />&nbsp; 2&nbsp; from (select event,time_waited<br />&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from v$system_event<br />&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by time_waited desc)<br />&nbsp; 5&nbsp; where rownum &lt; 11;<br />EVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIME_WAITED<br />---------------------------------------------------------------- -----------<br />rdbms ipc message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6207605140<br />DIAG idle wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1033906433<br />virtual circuit status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517841938<br />dispatcher timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517838356<br />Streams AQ: qmn coordinator idle wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517837446<br />Streams AQ: qmn slave idle wait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517833505<br />fbar timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517818073<br />smon timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517784201<br />pmon timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517766357<br />Streams AQ: waiting for time management or cleanup tasks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 517763231<br />10 rows selected.</p></blockquote><p>以上是一个测试环境中的Top 10等待事件。<p>在Oracle的Statspack Report中，有一部分信息为Top 5 Wait Events（在Oracle 9i中更改为Top 5 Time Events），这部分信息是来自v$system_event视图的采样。<p>以下是一个Statspack的诊断报告：</p><blockquote><p>Database&nbsp;&nbsp;&nbsp; DB Id&nbsp;&nbsp;&nbsp; Instance&nbsp;&nbsp;&nbsp;&nbsp; Inst Num&nbsp; Startup Time&nbsp;&nbsp; Release&nbsp;&nbsp;&nbsp;&nbsp; RAC<br />~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3313878466 ccdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 26-Jan-10 16:32 11.1.0.6.0&nbsp; NO</p><p>Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Platform&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPUs<br />Cores Sockets&nbsp;&nbsp; Memory (G)<br />~~~~ ---------------- ---------------------- ----- ----- ------- ------------<br />&nbsp;&nbsp;&nbsp;&nbsp; test7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux 64-bit for AMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0<p>Snapshot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Snap Id&nbsp;&nbsp;&nbsp;&nbsp; Snap Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sessions Curs/Sess Comment<br />~~~~~~~~&nbsp;&nbsp;&nbsp; ---------- ------------------ -------- --------- -------------------<br />Begin Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 27-Mar-10 15:32:01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.5<br />&nbsp; End Snap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 27-Mar-10 15:32:19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4<br />&nbsp;&nbsp; Elapsed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.30 (mins)<br />&nbsp;&nbsp; DB time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.02 (mins)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB CPU:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.02 (mins)<p>Cache Sizes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End<br />~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---------- ----------<br />&nbsp;&nbsp;&nbsp; Buffer Cache:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 224M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Std Block Size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8K<br />&nbsp;&nbsp;&nbsp;&nbsp; Shared Pool:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 356M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log Buffer:&nbsp;&nbsp;&nbsp;&nbsp; 6,209K<br />... ...<br />Top 5 Timed Events&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Avg %Total<br />~~~~~~~~~~~~~~~~~~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait&nbsp;&nbsp; Call<br />Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Waits&nbsp;&nbsp;&nbsp; Time (s)&nbsp;&nbsp; (ms)&nbsp;&nbsp; Time<br />----------------------------------------- ------------ ----------- ------ ------<br />CPU time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53.0<br />control file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp; 19.3<br />log file switch completion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 97&nbsp;&nbsp; 13.1<br />log file parallel write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp; 9.6<br />os thread startup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 26&nbsp;&nbsp;&nbsp; 1.7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------------------------------------------------------</p></blockquote><p>这里的Top 5 Timed Events是诊断的重要依据。<p>- The End -</p><h4  class="related_post_title">相关日志</h4><ul class="related_post"><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/oracle-10g11g-latch.html" title="Oracle 10g/11g Latch机制的变化">Oracle 10g/11g Latch机制的变化</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/latch-free.html" title="Latch Free（闩锁释放）">Latch Free（闩锁释放）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/enqueue.html" title="Enqueue （队列等待）">Enqueue （队列等待）</a></li><li>2010/05/13 -- <a href="http://www.dbtan.com/2010/05/event-about-log.html" title="日志文件相关等待">日志文件相关等待</a></li><li>2010/04/12 -- <a href="http://www.dbtan.com/2010/04/direct-path-readwrite.html" title="direct path read/write （直接路径读／写）">direct path read/write （直接路径读／写）</a></li></ul>]]></content:encoded> <wfw:commentRss>http://www.dbtan.com/2010/04/top-events.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
