ORA-04031: 共有メモリーのstringバイトを割当てできません("string","string","string","string")というエラーは、以下のような理由によって発生します。
- 共有プールの断片化などにより十分な連続領域が確保できない。
- 共有プール、ラージ・プールのサイズが不足している。
つまりは共有メモリー不足なわけですが、解消するには以下のような方法が考えられます。
- 絶対的に共有プール、ラージ・プールサイズが不足していると思われる場合はこれらのサイズを拡張する。
- リテラルのみが異なる SQL が大量発行されている場合はバインド変数の使用によって SQL を共有化し、共有プールの使用量を減らす。
- 大きな SQL、プロシージャ、パッケージなどを使用している場合は、これらを小さくすることで、共有プール、ラージ・プールの使用量を減らす。
- 大きなプロシージャ、パッケージなどを使用している場合は、それらを DBMS_SHARED_POOL パッケージを使用して共有プール上に固定化する。
- ALTER SYSTEM FLUSH SHARED_POOL コマンドを実行して共有プールをクリアすると同時に断片化を解消する。
1.、4.は Oracle の設定の調整、2.、3.はアプリケーション設計の改善ということになりますが、5.は1.~4.とは異なり定期メンテナンス的な解消方法となります。
そのため、どのようなタイミングで ALTER SYSTEM FLUSH SHARED_POOL コマンドを実行するかがキモとなります。
もし、ORA-04031 の発生するタイミングが特定できるような場合、その直前に ALTER SYSTEM FLUSH SHARED_POOL コマンドを実行するするのが効果的です。
例えば、デフォルトで毎日夜間に実行される自動オプティマイザ統計情報収集の実行時に発生するのであれば、その直前に ALTER SYSTEM FLUSH SHARED_POOLコマンドを実行するようスケジューリングしておくのが効果的です。
ORA-04031 が発生するタイミングが予測できない場合は、1日 1回、あるいは何時間かに 1回といった具合に定期的に実施するというのが現実的かと思います。
ただ、ALTER SYSTEM FLUSH SHARED_POOLコマンドを実行すると一時的にパフォーマンスが低下するなどの副作用もあるため、むやみやたらに実行するのは避けたほうがよいでしょう。