タイトル: データベースバッファキャッシュ
Oracleのデータベースバッファキャッシュの記事です。
データベースバッファキャッシュとはデータを取得(フェッチ)した際に一時的にデータをため込んでおく領域です。
データの参照だけではなく、更新の際もファイルのデータが直接変更される訳ではなく、一度データベースバッファキャッシュのデータが更新され、
バックグラウンドプロセスであるDBW(データベースライター)によってデータファイルにデータが書き込まれます。
フェッチする前に一度、データベースバッファキャッシュに目当てのデータがあるか探すことで、無駄なディスクアクセスを減らすことが出来ます。
(データベースバッファキャッシュ内に、対象データが全て格納されていればディスクアクセスが発生しません。)
動作の流れ(SELECT時)
- クライアントが
SELECTを発行 - Oracleはまずバッファキャッシュ内に該当データブロックがあるかを確認
- あれば(キャッシュヒット):そのままメモリから返す(高速)
- なければ(キャッシュミス):データファイルから読み込み → バッファキャッシュに格納 → 返す
動作の流れ(UPDATE時)
- クライアントが
UPDATEを発行 - 該当データブロックがバッファキャッシュに無ければ読み込み
- キャッシュ上のデータブロックを書き換え(dirtyブロック)
- 同時にREDOログバッファに変更情報を書き込み
- 後でDBW(データベースライター)が非同期にデータファイルへ書き戻す
つまり、DML処理はディスク書き込みを待たず、メモリ上で即座に完了します。これがOracleの高い応答性能の理由のひとつです。
SGA内での位置づけ
| SGA構成要素 | 役割 |
|---|---|
| データベースバッファキャッシュ(本ページ) | データブロックのキャッシュ |
| 共有プール | 解析済みSQL・実行計画のキャッシュ |
| REDOログバッファ | 更新内容のログを一時保持 |
| ラージプール | 大きなメモリ要求向け |
バッファキャッシュのサイズと管理
|
-- サイズ確認 |
サイズ変更
|
-- DB_CACHE_SIZE の変更 |
バッファプールの種類
| プール | 用途 |
|---|---|
| DEFAULT | 通常のバッファ(既定) |
| KEEP | キャッシュから追い出したくないオブジェクト向け |
| RECYCLE | 使い捨てに近いオブジェクト向け |
|
-- 特定テーブルをKEEPに |
性能調整のポイント
- ヒット率90%以上を目安に(OLTP系)。低ければバッファ拡張を検討
- 頻繁な大量フルスキャンはバッファを汚すため、必要ならRECYCLEプールへ
- マスター系の小テーブルは KEEP プールに固定すると安定
- 物理読み取り回数を監視(高い場合は最適化必要)
関連
- 親カテゴリ: SGA(システムグローバル領域)
- 共有プール: 共有プール
- REDOログバッファ: REDOログバッファ
- ラージプール: ラージプール