Flushing(清空) SHARED POOL

Flushing shared pool能够使得很多小块碎片合并,所以经常能够在一段时间内恢复系统的性能。清空之后可能也会产生短暂的性能下降(补充:因为需要做第一次的硬解析),因为这个操作同时也会把没造成shared pool碎片的共享SQL也清除了。清空shared pool的命令是:


ALTER SYSTEM FLUSH SHARED_POOL;(补充:不支持SESSION级别的)




注意:如果显式的使用以上命令,即使是用DBMS_SHARED_POOL.KEEP而被保留的那些对象可能也会被释放掉,包括它们占用的内存。如果是隐式的flush(由于shared pool上的内存压力)这个时候“kept"的对象不会被释放。


注意:如果sequence使用了cache选项,冲刷shared pool有可能会使sequence在其范围内产生不连续的记录。


使用DBMS_SHARED_POOL.KEEP('sequence_name','Q')来保持sequence会防止这种不连续的情况发生。




DBMS_SHARED_POOL.PURGE
       也可以不刷新整个shared pool,而只清空其中的单个对象。下面的文档说明了10g和11g中如何清空library cache heap。
Document:751876.1


DBMS_SHARED_POOL.PURGE Is Not Working On 10.2.0.4




使用 V$ 视图 (V$SQL 和 V$SQLAREA)


相关的latch来返回查询的数据。用来展示library cache和SQL area的视图就是值得注意的。所以我们建议有选择性的运行那些需要访问这种类型视图的语句。特别需要指出的是,查询V$SQLAREA会在library cache latch上产生大量的负载,所以一般可以使用对latch访问比较少的v$sql做替代——这是因为V$SQLAREA的输出是基于shared pool中所有语句的GROUP BY操作,而V$SQL没有用GROUP BY操作。




MTS, Shared Server 和 XA


       由于多线程服务器(MTS)的User Global Area (UGA)是存放在shared pool中的,所以会增加shared pool的负载。在Oracle7上的XA session也会产生同样的问题,因为他们的UGA也是在shared pool里面(在Oracle8/8i开始XA session不再把UGA放到shared pool中)。在Oracle8中Large Pool可以被用来减少MTS对shared pool活动的影响——但是,Large Pool中的内存分配仍然会使用"shared pool latch"。

私有内存分配不会使用"shared pool latch",所以在有些情况下从MTS切换到专有连接可以帮助减少竞争。

       在Oracle9i中,MTS被改名为"Shared Server"。但是对于shared pool产生影响的行为从根本上说还是一样的。