読み取り操作およびプリフェッチ入出力
Db2は、ほとんどすべての場合にデータを読み取るためにプリフェッチ入出力を使用しますが、特定のケースでは同期入出力を使用します。
同期読み取りが使用される場合、一度に 1 ページのみ取得されます。 同期読み取りの転送単位は、単一の入出力操作につき 1 ページです。 Db2 同期I/Oによるコストのかかる待ち時間を回避するために、可能な限りダイナミックプリフェッチ、シーケンシャルプリフェッチ、リストプリフェッチなどのプリフェッチメカニズムを使用します。
プリフェッチとは、ページのセット (通常は 32 ページ) を、1 回の 非同期入出力操作でバッファー・プールに読み込むメカニズムです。 プリフェッチにより、CPU コストと入出力コストの両方が大幅に節約されます。 1 回のプリフェッチ操作で読み取られるページの最大数は、操作に使用されるバッファー・プールのサイズによって決まります。
- 順次プリフェッチ
- Db2は、索引アクセスが使用可能でない場合に、表スキャン、および複数表のセグメント化表スペース内のデータへの順次アクセスのために 順次プリフェッチ を使用します。
- 動的プリフェッチ
- ダイナミックプリフェッチでは、 Db2 はページがシーケンシャルに読み込まれているかどうかを検出するシーケンシャル検出アルゴリズムを使用します。 Db2 クラスタ化されたページ、シーケンシャルなページ、ランダムなページを区別しようとします。 Db2 シーケンシャルページにはマルチページ非同期プリフェッチI/Oを、ランダムページには同期I/Oを使用します。
例えば、索引のクラスター率が 100% で、その索引に従いキーのシーケンス順で表が読み取られる場合、すべてのデータ・ページはクラスター化されており、順次読み取られます。 ただし、クラスター率が 100% よりやや低い場合、一部のページはランダムで、それらのページのみ同期入出力を使用して読み取られます。 動的プリフェッチは、順方向スキャンと逆方向スキャンの両方に対して動作します。
動的プリフェッチは順次検出を使用するので、順次プリフェッチよりも、アクセス・パターンの動的な変更に対応できます。 Db2 ほとんどの状況で動的プリフェッチを使用しますが、主な例外はテーブルスペーススキャンです。 索引スキャンでは、常に動的プリフェッチが使用されます。
- リスト・プリフェッチ
- Db2 リストプリフェッチ を使用して、インデックスまたは ログからのレコード識別子(RID)のリストによって決定されるデータページのセットを読み取ります。 Db2 Db2 また、非連続インデックスリーフページを読み込む際にもリストプリフェッチを使用します。これは、非リーフページから決定されるものです。また、LOBページを読み込む際にもLOBマップから決定されるリストプリフェッチを使用します。 他のタイプのプリフェッチと異なり、リスト・プリフェッチは、どのような種類の順次検出も使用しません。 その代わり、 Db2 は、以下のような特定の状況下では、リストプリフェッチを使用します
- 未編成の索引のリーフ・ページを読み取る場合。
- オプティマイザーがリスト・プリフェッチ・アクセス・パスを選択した場合。
- 高速のログ適用操作。
- 増分イメージ・コピー。
- フラグメント化された LOB データへのアクセス。
- RUNSTATS 表サンプリング。
Db2はRIDプールを使用して、リスト・プリフェッチのためのRIDリストを処理します。 RID プールのサイズは、MAXRBLK サブシステム・パラメーターの値で制御します。 リストプリフェッチ操作のRIDリスト処理を格納するのにRIDプールが小さすぎる場合、代わりにテーブルスペーススキャンが使用される場合があります。Db2 RID プールのサイズが小さすぎる場合、ワークファイルを使用して RID リストの処理を継続する可能性があります。 RID リスト処理の作業ファイルの使用については、MAXTEMPS_RID サブシステム・パラメーターの値で制御します。
順次スチールしきい値 (VPSEQT) を使用して、バッファー・プール内のランダムにアクセスされるページを保護できます。 ディスクからランダム・ページを読み取るより、順次ページを読み取る方が通常は高速であり、また順次ページには再アクセスする可能性が低いため、ランダム・ページを順次ページから保護することには利益があります。
すべてのプリフェッチI/Oは、 データベースサービスアドレス空間(ssnmDBM1 ) 内のサービスリクエストブロックの下で実行されるため、プリフェッチI/OのI/O時間は、クラス2 CPU時間とは非同期です。 ページ取得操作が、プリフェッチ入出力が完了するのを待つ場合、クラス 3 の中断時間が「他の読み取り入出力」の中断としてキャプチャーされます。
プリフェッチ CPU 時間は、システム SRB 時間としてキャプチャーされます。 プリフェッチの CPU 時間は通常は短いですが、索引スキャンのために増大する場合があります。これは、プリフェッチ・エンジンが、圧縮されている索引ページを圧縮解除するためです。
プリフェッチで読み取られるページ数
次の表は、バッファー・プール・サイズ (4 KB、8 KB、16 KB、および 32 KB) ごとに、非同期入出力ごとにプリフェッチで読み取られるページ数を示しています。
| バッファー・プール・サイズ | バッファー数 | 順次および LOB リスト・プリフェッチによって読み取られるページ | 動的および非 LOB リスト・プリフェッチによって読み取られるページ | ユーティリティー順次プリフェッチによって読み取られるページ |
|---|---|---|---|---|
| 4 KB | VPSIZE < 224 | 8 | 8 | 16 |
| 225 < VPSIZE <1,000 | 16 | 16 | 32 | |
1000 <= VPSIZE < 40,000
または VPSIZE*VPSEQT < 40000 |
32 | 32 | 64 | |
| 40,000 <= VPSIZE*VPSEQT < 80,000 | 64 | 32 | 64 | |
| 80,000 <= VPSIZE*VPSEQT | 64 | 32 | 128 | |
| 8 KB | VPSIZE < 48 | 4 | 4 | 8 |
| 48 < VPSIZE <400 | 8 | 8 | 16 | |
400 < VPSIZE < 20,000 または
VPSIZE*VPSEQT < 20000 |
16 | 16 | 32 | |
| 20,000 <= VPSIZE*VPSEQT < 40,000 | 32 | 16 | 32 | |
| 40,000 <= VPSIZE*VPSEQT | 32 | 16 | 64 | |
| 16 KB | VPSIZE < 24 | 2 | 2 | 4 |
| 24 < VPSIZE < 200 | 4 | 4 | 8 | |
| 200 <= VPSIZE< 10,000 または VPSIZE*VPSEQT < 10000 | 8 | 8 | 16 | |
| 10,000 <= VPSIZE*VPSEQT < 20,000 | 16 | 8 | 16 | |
| 20,000 <= VPSIZE*VPSEQT | 16 | 8 | 32 | |
| 32 KB | VPSIZE < 12 | 1 | 1 | 2 |
| 12 < VPSIZE < 100 | 2 | 2 | 4 | |
100 <= VPSIZE< 5,000
または VPSIZE*VPSEQT < 5,000 |
4 | 4 | 8 | |
| 5,000 <= VPSIZE*VPSEQT < 10,000 | 8 | 4 | 8 | |
| 10,000 <= VPSIZE*VPSEQT | 8 | 4 | 16 |