データベースの稼働状況を診断共有するサイト パフォーマンスセラピー
Statspackとは Statspack設定 statspackでの情報収集 statspackレポートの出力 便利スクリプト Oracleチューニング講座


                                  
第16章 複数バッファ・プールとは
データベース・バッファ・キャッシュにキャッシュされるオブジェクトには、頻繁にアクセスされるものとほとんどアクセスされないものがあり、そのアクセス・パターンにあわせてオブジェクトを別の複数バッファ・プールに分けてキャッシュできます。
本章では「第15章 データベース・バッファ・キャッシュのチューニングを学ぶ」(2)データベース・バッファ・キャッシュの効率化の項目に出てきた、複数バッファ・プールについて説明します。

概要
複数バッファ・プールでは、以下の3つのバッファ・プールを使用できます。
KEEP:再利用性の高いオブジェクトをバッファに保持するために使用
RECYCLE :再利用性の低いオブジェクトをバッファから排除するために使用
・DEFAULT:従来のバッファ・プール
これらのバッファ・プールを用意した後に各オブジェクト毎でどのプールを使用するか検討し、効率的にメモリーを使用しましょう。

選択のガイドライン
上記のKEEPプール及びRECYCLEプールを、どのような状態の時に選択するべきかを説明します。
(1)KEEPプール
KEEPプールの目的は、頻繁に使用するオブジェクトのブロックをメモリーに保存することです。
メモリーに保存しておきたいオブジェクトの総ブロック数を調査する必要がありますが、基本的にはデフォルト・プールの10%未満が目安となり、そのブロックが保存できるだけの領域をKEEPプールに設定します。
また、注意点としては以下が挙げられます。
■KEEPプールを使用するように定義したオブジェクトがKEEPプールのサイズを上回る場合はLRUアルゴリズ
 ムによって、メモリーから除去されます。
■データが追加されブロックが増加するような場合は、KEEPプールのサイズを超えてしまわないように監視す
 る必要があります。

(2)RECYCLEプール
RECYCLEプールには、ほとんど参照されないオブジェクトのブロックをキャッシュします。
大規模な表に対して索引スキャンをしているような場合、そのオブジェクトのRECYCLEプールへのキャッシュを検討します。目安としてはデフォルト・プールの2倍以上の大規模表となります。
RECYCLEプールを小さく設定した時の注意点は、トランザクションで同じブロックを必要とするような場合に、例えばデータを問合せてそれを確認した後に更新を行うような場合、すぐにフラッシュされてしまうため改めてディスクからの読込みが必要となってしまう事です。このような状態では効率的なメモリーの使用ができないためRECYCLEプールを適当な大きさに設定して、ブロックをトランザクション中は保持できるようにする必要があります。
複数バッファプールについて以下の図1で説明します。

図1

DEPT表の利用性が高くEMP表の利用性が低いという例で説明します。
①DEPT表の利用性が高いので、KEEPプールにこのオブジェクトを保持させるように設定します。
②EMP表の利用性が低いので、RECYCLEプールにこのオブジェクトを保持させるように設定します。

例)データベース・バッファ・キャッシュにキャッシュされているセグメントを調べる。
   V$BHビューは、SGA内に現在常駐するすべてのブロックのデータ・オブジェクトIDを示します。
SQL> SELECT o.object_name,count(*) number_of_blocks
2 FROM dba_objects o,v$bh bh
3 WHERE o.data_object_id = bh.objd
4 AND o.owner NOT IN('SYS','SYSTEM','SYSMAN')
5 GROUP BY o.object_name
6 ORDER BY count(*);

OBJECT_NAME NUMBER_OF_BLOCKS
------------------------------  ----------------
DEPT 6
EMP 127


設定
設定方法を説明します。
まず複数バッファ・プールを使用するための初期化パラメータ、セグメントの設定について確認します。
■パラメータの設定
<R8.1.Xまで>
・DB_BLOCK_BUFFERS :データベース・バッファ・キャッシュ全体のサイズ
・DB_BLOCK_LRU_LATCHES :合計のLRUラッチ数を設定(複数ラッチの指定ができる)
・BUFFER_POOL_KEEP :KEEPプールのサイズとLRUラッチ数
・BUFFER_POOL_RECYCLE :RECYCLEプールのサイズとLRUラッチ数

LRUラッチとはLRUリストをスキャンする際に必要なラッチです。
KEEP・RECYCLEプールは、DB_BLOCK_BUFFERSで指定したバッファから割当てられます。そのため、DB_BLOCK_BUFFERS-(BUFFER_POOL_KEEP+BUFFER_POOL_RECYCLE)がDEFAULTプールとなります。

<R9.0.1以降>
・DB_CACHE_SIZE :DEFAULTプールのサイズ
・DB_KEEP_CACHE_SIZE :KEEPプールのサイズ
・DB_RECYCLE_CACHE_SIZE :RECYCLEプールのサイズ

R9.0.1からDB_BLOCK_LRU_LATCHESパラメータは廃止され、LRUラッチは自動的に割当てられるようになりました。
またKEEP・RECYCLEプールはDB_CACHE_SIZEで指定したプールとは別の領域を使用します。

■オブジェクトの設定
以下のように表、索引などのCREATE文またはALTER文で、そのオブジェクトの使用するバッファ・プールを指定します。
{CREATE|ALTER} TABLE
・・・
STORAGE(BUFFER_POOL {KEEP|RECYCLE|DEFAULT})

実際の設定例を以下に記します。
<パラメータ設定例(R8.1.Xまで)>
DB_BLOCK_BUFFERS = 3000
DB_BLOCK_LRU_LATCHES = 4
BUFFER_POOL_KEEP = (BUFFERS:1000,LRU_LATCHES:1)
BUFFER_POOL_RECYCLE = (BUFFERS:500,LRU_LATCHES:2)

<パラメータ設定例(R9.0.1以降)>
DB_CACHE_SIZE = 54525952
DB_KEEP_CACHE_SIZE = 33554432
DB_RECYCLE_CACHE_SIZE = 16777216

例)TEST表をKEEPプールにキャッシュするように定義する。
SQL> CREATE TABLE test(NO number)
2 STORAGE(BUFFER_POOL keep);

表が作成されました。

SQL> SELECT segment_name,segment_type,buffer_pool
2 FROM user_segments
3 WHERE segment_name = 'TEST';

SEGMENT_NAME SEGMENT_TYPE BUFFER_POOL
--------------- ------------------- --------------
TEST TABLE KEEP
TEST表がKEEPプールにキャッシュされた事が確認できました。RECYCLEプールについても同様に設定します。

複数プールのキャッシュ・ヒット率
設定した複数プールのキャッシュ・ヒット率を確認してみましょう。
V$BUFFER_POOL_STATISTICSビューを参照すると、バッファ・プールごとのバッファ・キャッシュ・ヒット率を調査することができます。
V$BUFFER_POOL_STATISTICSビューはバッファ・プールごとの統計を示します。

<V$BUFFER_POOL_STATISTICSの主な列>
・NAME :バッファ・プール名
・BLOCK_SIZE :バッファ・プールのブロックサイズ
 ※R9.0.1以降は複数のブロック・サイズを設定できます。複数のブロック・
  サイズを使用した場合は、サイズごとのバッファ・プールを設定する必要
  があります。
・DB_BLOCK_GETS+
 CONSISTENT_GETS
:読み込まれた総ブロック数
・PHYSICAL_READS :物理読込みされたブロック数

バージョンによってはV$BUFFER_POOL_STATISTICSビューを使用するために、SYSユーザーでORACLE_HOME/rdbms/admin/catperf.sqlファイルを実行しビューを作成する必要がありますのでご注意ください。
<バッファ・キャッシュ・ヒット率の計算式>
複数バッファ・プールの各バッファ・プールのヒット率は以下で求められます。
ヒット率 = 1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS))

以下に実際にヒット率を調査した例を記します。
例)バッファ・プールごとのキャッシュ・バッファ・ヒット率を調査する。
SQL> SELECT name,block_size,physical_reads,db_block_gets,consistent_gets,
2 1-(physical_reads/(db_block_gets+consistent_gets)) as "HIT RATIO"
3 FROM v$buffer_pool_statistics;

NAME BLOCK_SIZE PHYSICAL_ DB_BLOCK_G CONSISTENT HITRATIO
-------------- ---------- ----------- --------- ---------- -------------
KEEP 8192 12 0 3684 .996742671
RECYCLE 8192 283579 0 654758 .566894944
DEFAULT 8192 41257 39884 582691 .933731679
上記の例のようにKEEPバッファのヒット率は、ほぼ100%になるように設定します。
また、RECYCLEバッファのヒット率は低くて構いません。

以上で複数バッファ・プールの説明は終了です。
データベース・バッファ・キャッシュのチューニングの際にご参考にしていただければと思います。
第17章では、REDOログ・バッファのチューニングについて復習します。


               
                        第17章 REDOログ・バッファのチューニングを学ぶ