リスト・プリフェッチ (PREFETCH='L' または 'U')

リスト・プリフェッチ では、索引から取得されたレコード ID (RID) リストによって決まるデータ・ページ・セットを読み取ります。

プログラム固有のプログラミングインターフェース情報の開始。リスト・プリフェッチ・アクセス・パスは、索引キー・シーケンスで決定される修飾行が順次ではなく、スキップ順次であるが疎か、または、DATAREPEATFACTORF統計の値が大きい場合に、照会に適しています。

リスト・プリフェッチの場合、フェッチされたデータ・ページが隣接する必要はありません。 1 回のリスト・プリフェッチで取り出せるページの最大数は 32 (ユーティリティーの場合は 64) です。 Db2 がリストプリフェッチを使用する予定である場合、PREFETCH列の値は「L」または「U」に設定されます。

リスト・プリフェッチは、単一索引アクセスまたは複数索引アクセスで使用できます。

オプティマイザーがリスト・プリフェッチ・アクセス・パスを選択すると、Db2は、以下のプロセスを使用します。
  1. 1 つ以上の索引に対するマッチング索引スキャンを通じて、行 ID のリストを取得します。
  2. 行 ID のリストをページ番号が昇順になるようにソートします。
  3. 行 ID のソート済みリストを使用して、順番にページをプリフェッチします。

リスト・プリフェッチの場合、索引により指定されるデータの配列は保たれません。 データにアクセスする前に RID はページ番号の順にソートされるため、 いずれかの列の順序でデータが取り出されることはありません。 ORDER BY 文節やその他の理由でデータの配列を行う必要がある場合は、 追加のソートが必要です。 Db2 パフォーマンス上の理由から、RID リストをソートせずにリストプリフェッチを使用することがあります。 そのような場合は、PREFETCH 列の値が「U」に設定されます。

ハイブリッド結合の場合、索引のクラスター比率が高いようであれば、 データ・アクセスの前にページ番号でソートしないことがあります。

リスト・プリフェッチは、索引スキャンのマッチング述部のほとんどに使用することができます。

リスト・プリフェッチが使用される時点

リスト・プリフェッチは以下の操作に使用されます。

  • 通常は、クラスター比率が 80% 未満の単一索引で使用されます。
  • クラスター比率が高い索引でも時々使用されます。これは、 アクセスするデータの見積量が、順次プリフェッチを効率的に実行するには少な過 ぎても、通常の読み取りであれば何度も繰り返さなければならないほど多い場合に限ります。
  • 複数索引アクセスを使用してデータをアクセスするときは必ず使用されます。
  • ハイブリッド結合で、内部表からデータをアクセスするときは必ず使用されます。
  • 索引に更新される可能性のある列が存在する場合は、 一般に更新可能カーソルに対して使用されます。
  • IN リスト述部が、メモリー内の表を通じて、マッチング述部として使用される場合 (ACCESSTYPE='IN')。
  • UPDATE文のインデックスアクセスで、インデックスキー列が更新される場合がある。 詳細は、「UPDATE および MERGE 文のインデックス・アクセス 」を参照してください。

Db2は、リスト・プリフェッチ処理にRIDプールを使用します。 RID プールの最大サイズは、MAXRBLK サブシステム・パラメーターで制御されます。 単一のリスト・プリフェッチ操作で使用しようとしている RID プールが大きすぎるか、表から読み取ろうとしている行が多すぎる場合、アクセス・パスは表スペース・スキャンに復帰する可能性があります。 ただし、MAXTEMPS_RIDサブシステム・パラメーターの値を設定することによって、RIDリスト処理が作業ファイル内で継続するように指定することができます。

リスト・プリフェッチの利点

リスト・プリフェッチは、スキップ順次アクセスに最適です。スキップ順次アクセスは、必要なデータが含まれていない中間ページがある多数の非順次データ・ページにシーケンス順にアクセスする場合に実行されます。 このような場合、動的プリフェッチでは、すべての中間ページが読み取られ、非同期ページ読み取りの数がページ取得操作の数を超過し、バッファー・プールが効率的に使用されません。 リスト・プリフェッチには、動的プリフェッチにはない以下の特定の利点があります。

  • リスト・プリフェッチは、バッファーを非常に経済的に使用します。
  • リスト・プリフェッチは、索引クラスター率に依存せず、データ・ページ取得があまり発生しない場合、動的プリフェッチよりも適切に実行されます。
  • ソート済みリスト・プリフェッチでは、同じデータ・ページに対して 2 つのページ取得操作が使用されることはありません。
  • 複数のデータ・ページをスキップする必要がある場合、リスト・プリフェッチでは、制御装置のヒット率が高い場合には、チャネル時間が最小化され、動的プリフェッチよりも高速な入出力が可能になります。
  • 一部のタイプの制御装置では、リスト・プリフェッチは、スキップ順次アクセスに関して順次入出力よりも高速です。 ストレージ・ベンダーに問い合わせて、このことが使用しているタイプの制御装置に当てはまるかどうか確認できます。

リスト・プリフェッチの欠点

ただし、動的プリフェッチと比べた場合、リスト・プリフェッチには以下に示す特定の欠点があります。

  • クラスター率が高い場合の範囲スキャンなど、行 ID が非常に高密度の場合には、リスト・プリフェッチより動的プリフェッチのほうが効率的です。
  • 一部のタイプの制御装置では、リスト・プリフェッチは、スキップ順次アクセスに関して順次入出力よりも低速です。 ストレージ・ベンダーに問い合わせて、このことが使用しているタイプの制御装置に当てはまるかどうか確認できます。
  • 索引キー列を使用する ORDER BY 節または GROUP BY 節を使用する照会について、リスト・プリフェッチでは、常に結果セットをソートする必要があります。一方、動的プリフェッチでは、常にソートする必要はありません。 ソートのコストは、読み取られるデータ・ページの数よりも、結果セットのサイズによって決まります。
  • アプリケーションが、結果セット全体をフェッチする前に、早まってカーソルを閉じる場合、リスト・プリフェッチを使用して索引を処理し、ソート済みの RID リストを作成する時間は無駄になります。