【ORACLE】データベースバッファキャッシュと共有プール


ここでは、ORACLEデータベースのメモリ領域SGA内のデーベースバッファキャッシュと共有プールについて紹介します。

データベースバッファキャッシの役割

データベースバッファキャッシュには、大きく2つの役割があります。

1つは、DISKから読み込んだデータ・ブロックをキャッシュしておき、データ読み込みの効率を向上させるための役割です。2つ目は、更新済みデータを溜めて置く、バッファとしての役割です。

キャッシュ

一度問合せのあったデータをメモリ領域に保持しておきます。

次回問合せがあった場合に、メモリ領域に存在するデータを戻すことで、データファイル・DISKへのアクセスを減らし、データ読み込みの速度を向上されることが出来ます。

しかし、データベースバッファキャッシュのサイズは無限にある訳ではなく、限りがあります。

よって、LRUの考えで、最後に読み込まれてから一番時間が経過したデータから順に、バッファキャッシュから追い出されていきます。

頻繁に読み込まれるデータやマスタ系のデータを半永久的にキャッシュに保持しておくようなテクニックもあります。「繰り返し実行するマスタ系の参照SQLをチューニングする方法」でもう少し詳しく紹介していますので参考にしてください。

バッファ

更新されたデータは、即時データファイルやDISKに書き込まれる訳ではありません。一旦、データベースバッファキャッシュに保持されます。

そして、チェックポイントが発行されたタイミングで、まとめてDBライタープロセスによってデータファイルに書き込まれます。これにより、データファイル・DISKへの書き込み回数を減らし、データ更新の速度向上を図っています。

ただし、大量のデータINSERTをする場合などには、バッファキャッシュに書き込むことが逆にパフォーマンスや性能のボトルネックとなることがあります。そういった場合には、「INSERT文のSQLチューニング方法」を参考にしてチューニングを試みてください。

共有プールの役割

共有プールは、ライブラリキャッシュ、ディクショナリキャッシュ、結果キャッシュの大きく3つの役割があります。

ライブラリキャッシュ

ライブラリキャッシュには、一度実行されたSQLの解析結果(実行計画など)の情報が格納されています。

SQLが実行されたとき、ORACLEオプティマイザによって、そのSQLが過去に実行され解析済みの情報がライブラリキャッシュ内に存在するかどうかチェックします。

解析済み情報が存在する場合は、解析済みの情報を使ってSQLを実行します。解析済み情報が存在しない場合は、ハードパースと呼ばれる解析処理が行われます。

ハードパースは非常に時間とコストのかかる処理で、SQLのパフォーマンスに大きく影響します。よってライブラリキャッシュが十分な容量でないと、データベース全体のパフォーマンスにも影響が出る可能性があります。

ディクショナリキャッシュ

データディクショナリビューの情報をキャッシュさせるための領域です。

データディクショナリビューとは、テーブルやインデックスなどのオブジェクトの定義や権限などの情報が格納されており、頻繁にアクセスされる情報です。そのため、ディクショナリキャッシュに保持し、アクセル効率を向上させています。

結果キャッシュ

SQLの問合せやファンクションの結果をキャッシュします。SQLにヒントでresul_cacheを書いた場合のSQL結果などが格納されます。