作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


使用Flush Shared Pool缓解共享池问题:

前面提到,本质上ORA-04031多数是由于SQL编写不当引起,所以如果能够修改应用绑定变量是最好的解决之道。当然如果应用不能修改,或者不能强制变量绑定,那么Oracle还提供一种应急处理方法,强制刷新共享池。

alter system flush shared_pool;

刷新共享池可以帮助合并碎片(small chunks),强制老化SQL,释放共享池,但是这通常是不推荐的做法,这是因为:

·Flush Shared Pool会导致当前未使用的cursor被清除出共享池,如果这些SQL随后需要执行,那么数据库将经历大量的硬解析,系统将会经历严重的CPU争用,数据库将会产生激烈的Latch竞争。
·如果应用没有使用绑定变量,大量类似SQL不停执行,那么Flush Shared Pool可能只能带来短暂的改善,数据库很快就会回到原来的状态。
·如果Shared Pool很大,并且系统非常繁忙,刷新Shared Pool可能会导致系统挂起,对于类似系统尽量在系统空闲时进行。

从Oracle 9i开始,Oracle的共享池算法发生了改变,Flush Shared Pool的方法已经不再推荐使用。

- The End -