【每日一摩斯】-Shared Pool優化和Library Cache Latch衝突優化 (1523934.1)-系列5
阿新 • • 發佈:2019-01-05
Flushing(清空) SHARED POOL
在使用大量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"的物件不會被釋放。也可以不重新整理整個shared pool,而只清空其中的單個物件。下面的文件說明了10g和11g中如何清空library cache heap。
Document:751876.1 DBMS_SHARED_POOL.PURGE Is Not Working On 10.2.0.4
由於多執行緒伺服器(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產生影響的行為從根本上說還是一樣的。