共用バッファプール利用による性能向上は、以前にアクセスしたページの内容をバッファ上に保持することで、二度目以降のアクセス時に発生するI/Oを削減することで発揮します。
そのため、表の全件検索のような、表やインデックスの全範囲を検索する処理は、共用バッファプールによる性能向上は期待できません。このような処理の性能向上を行うには、対象となる表やインデックス全体をメモリ上に保持する必要があります。
以下では、上記のような大量検索を行わない場合の見積もり方法を説明します。
(1) 応用プログラムのDBへのI/O回数の評価
応用プログラムからDBへのアクセス回数を評価します。正確な回数を評価することは非常に困難であるため、1レコードの処理に対して、表とインデックスに各1回のアクセスが発生するとして見積もります。
共用バッファプールのチューニングを行うことで、このアクセスにともなうDBへのI/O処理の回数が削減され、性能向上につながります。
(2) バッファhit率の見積もり
バッファhit率を見積もります。
バッファhit率とは、アクセスを行いたいページが共用バッファプール上に存在している可能性です。バッファhit率が50%であるとは、2回に1回の割合でアクセスしたいページが共用バッファプール上あることを意味します。言い換えると2回に1回の割合でDBへのI/O処理が発生しません。
応用プログラムの処理において、削減したいI/O回数と、アクセス対象となっている表をもとに、各表とインデックスのバッファhit率を評価します。
バッファhit率を大きくすると、その分メモリが多く必要となります。また、表が大きければ、同様にメモリが多く必要となります。インデックスは、表に比べるとその大きさは小さいため、一般的に、表のバッファhit率を高くするより、インデックスのバッファhit率を高くした方が、少ないメモリで大きな性能向上が得られます。
また、ほとんどアクセスされない表やインデックスより、頻繁にアクセスされる表やインデックスのバッファhit率を高くした方が、性能向上の効果は高くなります。
これらのことをもとに、各表とインデックスに対して、どの程度のバッファhit率を期待したいのかを評価します。
(3) 常駐枚数の見積もり
常駐枚数の見積もりを行います。
常駐枚数とは、共用バッファプール上で常にDBのページの内容を保持しているバッファの枚数です。この値はバッファ数と安全率の積に一致します。
以下の式により見積もりを行います。
ただし、バッファhit率として100%(完全常駐)にしたい場合には、“表やインデックス全体をメモリ上に保持する場合の見積もり方法”を参照してください。
常駐枚数 = 表の割付け量 × バッファhit率
常駐枚数 = インデックス部の割付け量/ページ長
常駐枚数 = データ部の割付け量/ページ長 × バッファhit率
常駐枚数 = インデックス部の割付量/ページ長 + データ部の割付量/ページ長 × バッファhit率
(4) バッファ数の見積もり
最後に、以下の式により共用バッファプールのパラメタを見積もります。
次の順に見積もりを行います。
当該バッファプールを同時に使用する応用プログラムの多重度を求めます。
応用プログラム多重度はすべてのコネクションに関して並列度を合計したものになります。ただし、合計した値が16未満の場合には、16とします。
ここで求まった値を“A”とします。
当該バッファプールと結合されている表の全件検索や並列スキャンを行っていないコネクションに関しては、コネクション毎の使用バッファ枚数は4として見積もります。
また、(1)で合計した値が16未満のため16にしていた場合には、増やした多重度の分も使用バッファ枚数は4として見積もります。
当該バッファプールと結合されている表の全件検索や並列スキャンを行っている場合には、次の式で見積もります。
例えば、並列度が2で、ページ長が8KBの表に対して表の全件検索を行っているコネクションの場合には、コネクション毎の使用バッファ枚数は512K / 8K × 2 = 128 となります。
当該バッファプールを同時に使用するコネクションすべてに関して、使用バッファ枚数の合計を算出します。
ここで求まった値をBとします。
上で求めた値をもとに、計算します。
ただし、応用プログラム多重度が16未満の場合には、応用プログラム多重度を16として計算します。
注) 計算した結果が割付け量を超えた場合には、“表やインデックス全体をメモリ上に保持する場合の見積もり方法”による見積もりを行ってください。
算出例
ページ長 | 32KB |
表・インデックス種別 | 表 |
割付け量 | 500MB |
バッファhit率 | 30% |
表の全件検索も並列スキャンもしないコネクション数 | 100 |
常駐枚数 = 500M / 32K × 0.3 = 4800
A = MAX( 16, 1+1+・・・ +1 ) = MAX( 16, 1×100 ) = MAX( 16, 100 ) = 100
B = 4+4+ ・・・・ +4 = 4 × 100 = 400
バッファ数 = 4800 +Max(A×2,B) ×2=4800 + Max(200,400)× 2 =5600 |
危険率 = 1 - 100/5000 = 0.98 = 98% |
安全率 = 1 - (100×2)/5000 = 0.96 = 96% |
ページ長 | 8KB |
表・インデックス種別 | インデックス |
インデックス部割付け量 | 3MB |
データ部割付け量 | 50MB |
バッファhit率 | 80% |
表の全件検索も並列スキャンもしないコネクション数 | 75 |
表の全件検索を並列スキャンで行うコネクション数 | 5 (並列度5) |
常駐枚数 = 3M / 8K + 50M / 8K × 0.8 = 5504
A = MAX( 16, 1+1+ ・・・ +1 + 5+5+・・・・+5 ) = MAX( 16, 1×75 + 5×5) = MAX( 16, 100 ) = 100
B = 4+4+ ・・・ +4 + (512/16)×5 + (512/16)×5 + ・・・・ + (512/16)×5 = 4×75 + (512/16)×5×5 = 300 + 800 = 1100
バッファ数 = 5504 + Max(A×2,B) ×2= 5504 +Max(200,1100)×2 =7704 |
危険率 = 1 - 100/5704 = 0.98 = 98% |
安全率 = 1 - (100×2)/5704 = 0.96 = 96% |
表やインデックス全体をメモリ上に保持する場合の見積もり方法
表やインデックスの全体をメモリ上に保持すると、データベースからのデータ読込みが発生しなくなるため、安定した性能向上を行うことができます。
メモリ常駐を行う機能(rdbresidentコマンド)を提供しています。そのため、当機能を使用してください。
以下では、メモリ常駐を行う機能が使用できない場合の共用バッファプールの見積もり方法を説明します。
以下の式で常駐量をもとめ、常駐量の値の範囲に従い、次のように見積もってください。
常駐量 = 割付け量 / ページ長
バッファ数 = 32 |
危険率 = 安全率 = 50% |
バッファ数 =常駐量 + 16 |
危険率 = 安全率 = 1 - 16/バッファ数 |
バッファ数 = 常駐量 / 0.99 |
危険率 = 安全率 = 99% |