この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-05-17 06:28:43

タイトル: データベースバッファキャッシュ

Oracleのデータベースバッファキャッシュの記事です。

データベースバッファキャッシュとはデータを取得(フェッチ)した際に一時的にデータをため込んでおく領域です。

データの参照だけではなく、更新の際もファイルのデータが直接変更される訳ではなく、一度データベースバッファキャッシュのデータが更新され、

バックグラウンドプロセスであるDBW(データベースライター)によってデータファイルにデータが書き込まれます。

フェッチする前に一度、データベースバッファキャッシュに目当てのデータがあるか探すことで、無駄なディスクアクセスを減らすことが出来ます。

(データベースバッファキャッシュ内に、対象データが全て格納されていればディスクアクセスが発生しません。)

動作の流れ(SELECT時)

  1. クライアントが SELECT を発行
  2. Oracleはまずバッファキャッシュ内に該当データブロックがあるかを確認
  3. あれば(キャッシュヒット):そのままメモリから返す(高速)
  4. なければ(キャッシュミス):データファイルから読み込み → バッファキャッシュに格納 → 返す

動作の流れ(UPDATE時)

  1. クライアントが UPDATE を発行
  2. 該当データブロックがバッファキャッシュに無ければ読み込み
  3. キャッシュ上のデータブロックを書き換え(dirtyブロック)
  4. 同時にREDOログバッファに変更情報を書き込み
  5. 後でDBW(データベースライター)が非同期にデータファイルへ書き戻す

つまり、DML処理はディスク書き込みを待たず、メモリ上で即座に完了します。これがOracleの高い応答性能の理由のひとつです。

SGA内での位置づけ

SGA構成要素役割
データベースバッファキャッシュ(本ページ)データブロックのキャッシュ
共有プール解析済みSQL・実行計画のキャッシュ
REDOログバッファ更新内容のログを一時保持
ラージプール大きなメモリ要求向け

バッファキャッシュのサイズと管理

-- サイズ確認
SHOW PARAMETER db_cache_size;

-- ヒット率(簡易)
SELECT name, value
  FROM v$sysstat
 WHERE name IN (
    'db block gets',
    'consistent gets',
    'physical reads'
 );

-- 概算ヒット率 = 1 - (physical reads / (db block gets + consistent gets))

サイズ変更

-- DB_CACHE_SIZE の変更
ALTER SYSTEM SET DB_CACHE_SIZE = 1G SCOPE = BOTH;

-- 自動メモリ管理の場合
ALTER SYSTEM SET MEMORY_TARGET = 4G SCOPE = BOTH;

バッファプールの種類

プール用途
DEFAULT通常のバッファ(既定)
KEEPキャッシュから追い出したくないオブジェクト向け
RECYCLE使い捨てに近いオブジェクト向け

-- 特定テーブルをKEEPに
ALTER TABLE master_data STORAGE (BUFFER_POOL KEEP);

性能調整のポイント

  • ヒット率90%以上を目安に(OLTP系)。低ければバッファ拡張を検討
  • 頻繁な大量フルスキャンはバッファを汚すため、必要ならRECYCLEプールへ
  • マスター系の小テーブルは KEEP プールに固定すると安定
  • 物理読み取り回数を監視(高い場合は最適化必要)

関連