ORA-04031が発生した場合、以下のKROWNを参考に調査を行う。
KROWN:10602
1. 共有プールが断片化されている等の理由で、十分な連続領域が確保できない
# 大規模プールを利用するのは特定のケースのみであるため、通常、断片化が顕著
# になるほど細かく利用されることはありません。
2. 共有プール、大規模プールのサイズが不足している
さらに細かく考えると
1-1. 断片化が顕著になり、連続空き領域が確保できていない
1-2. 予約済み領域のサイズが不適切で、予約済み領域が不足している、又は予約済み
領域が余っていて通常の共有プールが不足している
2-1. カーソルの共有が行えていないため、共有プールを無駄に消費している
2-2. 大きなPL/SQLオブジェクトに必要な領域を共有プール上に確保できない
2-3. 根本的に共有メモリのサイズが少ない
といったような原因が考えられます。
対策
1-1:断片化を解消するためには、権限のあるユーザーで
SQL> alter system flush shared_pool;
1-2. ORA-4031の発生後すぐに次のSQL文を実行します
SQL> SELECT free_space, used_space, request_misses, last_failure_size
2 FROM v$shared_pool_reserved;
その結果
request_misses > 0 の場合
SHARED_POOL_RESERVED_SIZEの値を増加させることを考慮します。
request_misses = 0 の場合
SHARED_POOL_RESERVED_SIZEの値を減らして予約済み領域に割り当てられてい
たメモリを通常の共有プールに割り当ててやる、又はSHARED_POOL_SIZEの値
を増やして共有プールのサイズを上げることを考慮します。
2-1. カーソルの共有等が行えていないため、バインド変数を活用することで共有プールの無駄な消費を抑える。
2-2. あらかじめ頻繁に使用されるサイズの大きなPL/SQLオブジェクトをプロシージャDBMS_SHARED_POOL.KEEPを使用することで
一旦共有プール上に確保したオブジェクトが共有プールからフラッシュされないようにする。
DBMS_SHARED_POOLパッケージについては、次のKROWNを参照してください。
参考 KROWN:53356 DBMS_SHARED_POOLパッケージによる共有プールの有効活用
2-3. SHARED_POOL_SIZEを増加させる
最終更新:2011年08月24日 14:12