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

<channel>
	<title>惜分飞 &#187; dbms_shared_pool.purge</title>
	<atom:link href="https://www.xifenfei.com/tag/dbms_shared_pool-purge/feed" rel="self" type="application/rss+xml" />
	<link>https://www.xifenfei.com</link>
	<description>提供7*24专业数据库(Oracle,SQL Server,MySQL,PostgreSQL等)恢复和技术支持@Tel:17813235971</description>
	<lastBuildDate>Sat, 07 Nov 2026 15:45:44 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>dbms_shared_pool.purge工作原理猜测</title>
		<link>https://www.xifenfei.com/2013/05/dbms_shared_pool-purge%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86%e7%8c%9c%e6%b5%8b.html</link>
		<comments>https://www.xifenfei.com/2013/05/dbms_shared_pool-purge%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86%e7%8c%9c%e6%b5%8b.html#comments</comments>
		<pubDate>Fri, 03 May 2013 15:21:09 +0000</pubDate>
		<dc:creator><![CDATA[惜分飞]]></dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[dbms_shared_pool.purge]]></category>

		<guid isPermaLink="false">https://www.xifenfei.com/?p=4315</guid>
		<description><![CDATA[联系：手机/微信(+86 17813235971) QQ(107644445)  &#8230; <a href="https://www.xifenfei.com/2013/05/dbms_shared_pool-purge%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86%e7%8c%9c%e6%b5%8b.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<div id="xifenfeicopyright">
<p>联系：<a href="https://www.xifenfei.com/about_xifenfei" target="_blank">手机/微信(+86 17813235971)   QQ(107644445)</a><a target="_blank" href="http://wpa.qq.com/msgrd?v=3&#038;uin=107644445&#038;site=qq&#038;menu=yes"><img src="https://www.xifenfei.com/wp-content/themes/img/site_qq.jpg" alt="QQ咨询惜分飞" title="QQ咨询惜分飞"/></a></p>
<p>标题：<a href="https://www.xifenfei.com/2013/05/dbms_shared_pool-purge%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86%e7%8c%9c%e6%b5%8b.html" target="_blank">dbms_shared_pool.purge工作原理猜测</a></p>
<p>作者：<a href="https://www.xifenfei.com" target="_blank">惜分飞</a>©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]</p>
</div>
<p>思考为什么dbms_shared_pool.purge清理掉某条sql在shared pool中的信息，为什么当该sql再次执行的时候FIRST_LOAD_TIME时间没有发生改变<br />
<strong>测试purge某条sql,再次加重该sql,FIRST_LOAD_TIME不变</strong></p>
<pre class="brush: sql; title: ; notranslate">
SQL&gt; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-02-12 16:44:00

SQL&gt;  select SQL_ID,FIRST_LOAD_TIME from v$sql where sql_text like 'select to_char(sysdate,%dual';     

SQL_ID        FIRST_LOAD_TIME
------------- --------------------------------------
46zkt5sgbxrxv 2013-02-12/16:43:59

SQL&gt; SELECT ADDRESS,HASH_VALUE,SQL_TEXT FROM V$SQLAREA where sql_id='46zkt5sgbxrxv';

ADDRESS  HASH_VALUE
-------- ----------
SQL_TEXT
--------------------------------------------------------------------------------
2587FFAC  515825595
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual


SQL&gt;  exec dbms_shared_pool.purge('2587FFAC,515825595','C');

PL/SQL procedure successfully completed.

SQL&gt; SELECT ADDRESS,HASH_VALUE,SQL_TEXT FROM V$SQLAREA where sql_id='46zkt5sgbxrxv';

no rows selected

SQL&gt; !date
Tue Feb 12 16:55:15 CST 2013

SQL&gt; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-02-12 16:55:23

SQL&gt; select FIRST_LOAD_TIME FROM V$SQLAREA where sql_id='46zkt5sgbxrxv';

FIRST_LOAD_TIME
--------------------------------------
2013-02-12/16:43:59
</pre>
<p>这里可以看出来第一次执行sql语句的时候，FIRST_LOAD_TIME为2013-02-12/16:43:59，然后我使用dbms_shared_pool.purge&#8221;清除掉&#8221;了SQL语句在shared pool中的信息，但是当我再次执行执行相同的sql时候，查询发现FIRST_LOAD_TIME时间未发生改变.因为v$sql中对应的只有一张基表x$kglcursor_child,并没有where条件,而让记录不在v$sql中显示,证明是x$基表的东西发生了改变,而该基表是直接来自内存,从而个人猜测,<em><strong>oracle的dbms_shared_pool.purge是在shared pool该sql的内存某些部位增加了某些标记,从而使得该sql不能在v$sql等相关视图中显示,如果sql以前占用的内存区域没有被老化出shared pool,下次该sql再次访问的时候,优先启用该内存区域并修改相关值</strong></em>,从而出现了我们的FIRST_LOAD_TIME不改变的现象.<br />
<br />
<strong>验证猜测</strong></p>
<pre class="brush: sql; title: ; notranslate">
--session 1
SQL&gt; exec dbms_shared_pool.purge('2587FFAC,515825595','C');

PL/SQL procedure successfully completed.

SQL&gt; select FIRST_LOAD_TIME FROM V$SQLAREA where sql_id='46zkt5sgbxrxv';

no rows selected

SQL&gt; declare
  2  begin 
  3  FOR a IN  1..10000000  
  4  LOOP  
  5  EXECUTE IMMEDIATE 'insert into t_xifenfei values ('||a||')';
  6  END LOOP;
  7  commit;
  8  end;  
  9  /

--session 2
SQL&gt; select count(sql_text) from v$sql where sql_text like 'insert into t_xifenfei%'
  2  ;

COUNT(SQL_TEXT)
---------------
            444

SQL&gt; /

COUNT(SQL_TEXT)
---------------
            445

SQL&gt; /

COUNT(SQL_TEXT)
---------------
            444

SQL&gt; /

COUNT(SQL_TEXT)
---------------
            442
--动态sql还在执行，但是共享池中的该sql不再增加，说明共享池已经满，
--部分历史的sql语句已经被刷新出共享池purge的sql语句肯定被老化出来了shared pool，然后再次执行该sql语句

--session 3
SQL&gt; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-02-12 17:09:08

SQL&gt; select SQL_ID,FIRST_LOAD_TIME from v$sql where sql_text like 'select to_char(sysdate,%dual';

SQL_ID        FIRST_LOAD_TIME
------------- --------------------------------------
46zkt5sgbxrxv 2013-02-12/17:09:07
</pre>
<p>这里可以看到当shared pool发生部分数据被刷出来之时，而且根据先进先出的原则,我们可以知道开始被purge的sql语句肯定被老化出shared pool,从而当再次执行相同sql的时候，生成了新的FIRST_LOAD_TIME,从而验证了部分猜测.<br />
在此也补充另外一个朋友的咨询问题:在什么情况下FIRST_LOAD_TIME会发生改变,我认为是当sql语句占用的内存区域被老化出去,然后再进入内存的时候会发生改变,flush shared_pool实现效果和老化出来一样</p>
<pre class="brush: sql; title: ; notranslate">
SQL&gt; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-02-12 17:09:08

SQL&gt; select SQL_ID,FIRST_LOAD_TIME from v$sql where sql_text like 'select to_char(sysdate,%dual';

SQL_ID        FIRST_LOAD_TIME
------------- --------------------------------------
46zkt5sgbxrxv 2013-02-12/17:09:07

SQL&gt; alter system flush shared_pool;

System altered.

SQL&gt; select SQL_ID,FIRST_LOAD_TIME from v$sql where sql_text like 'select to_char(sysdate,%dual';

no rows selected

SQL&gt; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-02-12 18:52:33

SQL&gt; select SQL_ID,FIRST_LOAD_TIME from v$sql where sql_text like 'select to_char(sysdate,%dual';

SQL_ID        FIRST_LOAD_TIME
------------- --------------------------------------
46zkt5sgbxrxv 2013-02-12/18:52:33
</pre>
<p>因为shared pool的东西很复杂,我这里也只是大概的初步猜测，没有深入到系统级别dump之类的方法分析，如果有兴趣的朋友可以深入研究并探讨.</p>
<div id="crp_related"><ul><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/04/9i%e4%b8%ad%e6%b8%85%e9%99%a4%e7%89%b9%e5%ae%9a%e8%a1%a8%e7%9b%b8%e5%85%b3%e6%89%a7%e8%a1%8c%e8%ae%a1%e5%88%92.html" rel="bookmark" class="crp_title">9I中清除特定表相关执行计划</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2013/05/%e4%bd%bf%e7%94%a8idle_time%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9.html" rel="bookmark" class="crp_title">使用IDLE_TIME注意事项</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2011/04/%e5%85%b3%e4%ba%8e%e6%97%a5%e6%9c%9fsql%e8%af%ad%e5%8f%a5.html" rel="bookmark" class="crp_title">关于日期sql语句</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/05/sql_id%e5%92%8chash-value%e7%9a%84%e9%83%a8%e5%88%86%e8%bd%ac%e6%8d%a2.html" rel="bookmark" class="crp_title">sql_id和hash value的部分转换</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2013/03/oracle-12c-rman-recover-table.html" rel="bookmark" class="crp_title">ORACLE 12C RMAN recover table</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2011/02/oracle-%e4%b8%ad%e5%a6%82%e4%bd%95%e5%ae%9a%e4%bd%8d%e9%87%8d%e8%a6%81%e6%b6%88%e8%80%97%e8%b5%84%e6%ba%90%e5%a4%9a%e7%9a%84sql.html" rel="bookmark" class="crp_title">oracle 中如何定位重要(消耗资源多)的SQL</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/02/%e6%b8%85%e9%99%a4%e6%8e%89shared-pool%e4%b8%ad%e6%9f%90%e6%9d%a1sql%e8%af%ad%e5%8f%a5%e6%96%b9%e6%b3%95.html" rel="bookmark" class="crp_title">清除掉shared pool中某条sql语句方法</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/05/shared-pool-latch-%e7%ad%89%e5%be%85%e4%ba%8b%e4%bb%b6.html" rel="bookmark" class="crp_title">shared pool latch 等待事件</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/07/%e4%bd%bf%e7%94%a8flashback-query%e6%81%a2%e5%a4%8d%e8%a2%ab%e5%88%a0%e9%99%a4plsql.html" rel="bookmark" class="crp_title">使用flashback query恢复被删除plsql</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2013/05/mon_mods%e5%92%8cmon_mods_all%e7%bb%9f%e8%ae%a1dml%e6%93%8d%e4%bd%9c%e6%ac%a1%e6%95%b0.html" rel="bookmark" class="crp_title">MON_MODS$和MON_MODS_ALL$统计DML操作次数</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2013/08/%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ad%e8%ae%b0%e5%bd%95%e6%97%b6%e9%97%b4%e5%92%8c%e7%8e%b0%e5%ae%9e%e4%b8%ad%e6%97%b6%e9%97%b4%e7%9b%b8%e4%ba%92%e8%bd%ac%e6%8d%a2.html" rel="bookmark" class="crp_title">数据库中记录时间和现实中时间相互转换</a></li><li style="list-style-type:decimal;font-size:11px;" ><a href="https://www.xifenfei.com/2012/11/%e6%95%b0%e6%8d%ae%e6%96%87%e4%bb%b6%e7%9a%84creation_time%e6%9d%a5%e6%ba%90%e5%92%8c%e7%ae%97%e6%b3%95.html" rel="bookmark" class="crp_title">数据文件的CREATION_TIME来源和算法</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>https://www.xifenfei.com/2013/05/dbms_shared_pool-purge%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86%e7%8c%9c%e6%b5%8b.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
