【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列5
【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列5
【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列4
http://www.zzzyk.com/database/201309/240771.html
在使用大量literal SQL的系统中,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)
注意有一些V$视图需要获取相关的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"。
使用dedicate connections(专有连接)替代MTS可以使UGA在进程私有内存中分配而不是shared pool。私有内存分配不会使用"shared pool latch",所以在有些情况下从MTS切换到专有连接可以帮助减少竞争。
在Oracle9i中,MTS被改名为"Shared Server"。但是对于shared pool产生影响的行为从根本上说还是一样的。