タイトル: 共有プール
Oracleの共有プールの記事です。
共有プールとは解析済みのSQLのデータをキャッシュしておく領域です。
SQLの実行計画を保持しておくことで、同じSQLが発行された際の解析処理を省くことが出来ます。SGA(システムグローバル領域)を構成する主要メモリのひとつで、Oracleのパフォーマンスに直結する重要な領域です。
共有プールの構成
共有プールは大きく2つのキャッシュから構成されます。
| 領域 | 役割 |
|---|---|
| ライブラリキャッシュ | 解析済みSQL文、実行計画、PL/SQLプログラムをキャッシュ |
| データディクショナリキャッシュ(ローキャッシュ) | テーブル定義・ユーザー権限・統計情報など、データディクショナリ情報をキャッシュ |
SQL実行時の流れ
- クライアントから SQL が送られる
- SQLハッシュ値を計算 → 共有プールに同じSQLがあるか確認
- あれば(ソフトパース): 既存の実行計画を再利用
- なければ(ハードパース): 構文解析・最適化を実施し、結果を共有プールに格納
- 実行
ハードパースは重いため、同じSQLは共有プールから再利用されるのがパフォーマンスの肝になります。
共有プールサイズの確認
|
-- 設定値 |
サイズ調整
|
-- 共有プールサイズを変更 |
バインド変数の重要性
共有プールの有効活用には、バインド変数の使用が必須です。リテラル値を埋め込んだSQLはハッシュ値が変わり、毎回ハードパースが発生します。
|
-- NG: ID毎にハードパースが走る |
共有プールがあふれる症状と対処
- ORA-04031: shared memory pool で共有メモリ確保不可 — サイズ不足/フラグメンテーション
- 対処1:
SHARED_POOL_SIZEを大きく - 対処2:
SHARED_POOL_RESERVED_SIZEを増やす - 対処3: 共有プールをフラッシュ
ALTER SYSTEM FLUSH SHARED_POOL;(一時対処) - 根本対処: バインド変数を使う、無駄に大量のSQLバリエーションを減らす
関連
- 親カテゴリ: SGA(システムグローバル領域)
- SGAの他要素: データベースバッファキャッシュ / REDOログバッファ / ラージプール