photo credit: nickwheeleroz via photopin cc
はじめに
Oracle DBは、SQLの結果を一時的なメモリ領域(バッファキャッシュ)に記憶して、次に同じような問い合わせがあった場合に、いちいちディスクを読みに行かずにバッファキャッシュから結果を取得することで、高速に結果を返すことができるようになっています。
このバッファキャッシュのサイズは、システムや運用環境に応じた適切な値を設定するのが良いとされています。そこで、適切なバッファキャッシュサイズを見極めるための方法を調べてみました。
翔泳社
売り上げランキング: 322,732
バッファキャッシュサイズを調べる
現在のバッファキャッシュサイズを調べるには、sysユーザで以下のコマンドを実行すると分かります。
show parameter DB_CACHE_SIZE
DB_CACHE_ADVICEを有効にして統計をとる
Oracleには、バッファキャッシュアドバイザという機能があります。
この機能は、バッファキャッシュの使用状況について統計をとり、データベース管理者が適切なバッファキャッシュサイズを見極めるための情報を提供してくれます。
バッファキャッシュアドバイザは、ON/OFFの切り替えができ、一定期間ONにしておくことで、運用しているシステムのバッファキャッシュの状況を知ることができます。
バッファキャッシュアドバイザを有効*1にするには、以下のコマンドを実行します。
alter system set DB_CACHE_ADVICE=ON
バッファキャッシュアドバイザによる予測を参考にする
DB_CACHE_ADVICEをONにしてしばらく統計情報を収集したら、今度はV$DB_CACHE_ADVICEというビューを見てみます。
V$DB_CACHE_ADVICEビューを見ると、現在のバッファサイズを基準に、バッファキャッシュを小さくした場合と大きくした場合で、物理読み込み(ディスクアクセス)が何回発生するかを予測した値がわかります。
COLUMN size_for_estimate FORMAT 999,999,999,999 heading 'Cache Size (MB)' COLUMN buffers_for_estimate FORMAT 999,999,999 heading 'Buffers' COLUMN estd_physical_read_factor FORMAT 999.90 heading 'Estd Phys|Read Factor' COLUMN estd_physical_reads FORMAT 999,999,999 heading 'Estd Phys| Reads' SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads FROM V$DB_CACHE_ADVICE WHERE name = 'DEFAULT' AND block_size = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size') AND advice_status = 'ON';
OTNの資料からですが、上記のクエリを実行すると、次のような結果が得られます。
V$DB_CACHE_ADVICEビューの予測結果
Estd Phys|Read Factorの値が1.0になりはじめたところが現在のバッファキャッシュサイズ(64MB)です。これを半分の32MBにして運用した場合、物理読込みが1.72倍(72%増える)になるとアドバイザが予測しています。
反対に、倍の128MBにした場合、Estd Phys|Read Factorの値は64MBのときと同じ1.0なので、バッファキャッシュサイズを倍にしても効果が得られないとアドバイザは予測しています。
このように、V$DB_CACHE_ADVICEビューを見ることで、バッファキャッシュサイズがどの程度あれば、物理読み込みを抑えられるかというのが、ひと目で分かるようになっています。
まとめ
適切なバッファキャッシュサイズを見極めるには、以下の2つのポイントが重要だということが分かりました。
- DB_CACHE_ADVICE=ONにして統計をとる
- V$DB_CACHE_ADVICEビューからバッファキャッシュアドバイザがはじきだした数値を確認する
関連エントリ
*1:ONで運用した場合、統計収集のオーバヘッドが発生します。一定期間運用したら、OFFにしたほうが良いです。