事前に索引ページおよびデータ・ページをバッファー・プールに取り出しておくと、 入出力を完了するのを待つ時間が減るので、パフォーマンスは向上します。 ページの事前取り出し とは、いくつかのページを、 後で使用するという想定でディスクからリトリーブしておくということです。 事前取り出しには、2 つのカテゴリーがあります。
これらの 2 つのデータ・ページ読み取り方法は、通常の読み取りを補うものです。 通常の読み取りは、1 ページまたは少数の連続ページがリトリーブされるときに使用されます。 通常の読み取り時には、データの 1 ページが転送されます。
事前取り出しを使用可能にする方法についての詳細は、 事前取り出しおよび並列入出力を行うための入出力サーバーの構成を参照してください。
1 回の入出力操作で複数の連続したページをバッファー・プールに読み込むと、 アプリケーション実行時のオーバーヘッドは大幅に短縮されます。 さらに、複数の入出力操作を並列して行うことによって複数のページ範囲を同時に読み込むと、 アプリケーションが入出力操作の完了を待機する時間を短縮するのに役立ちます。
事前取り出しが開始されるのは、データベース・マネージャーが、順次入出力が適切であり、 事前取り出しを行うとパフォーマンスが向上すると判断したときです。 表走査や表分類などの場合、データベース・マネージャーは、 順次事前取り出しにより入出力のパフォーマンスが向上することを容易に判断できます。 このような場合は、データベース・マネージャーは自動的に順次事前取り出しを開始します。 たとえば、次の例では表走査が必要になるので、順次事前取り出しが実行されます。
SELECT NAME FROM EMPLOYEE
データベース・マネージャーが事前取り出しで取り出すページ数は、 各表スペースごとに CREATE TABLESPACE または ALTER TABLESPACE のいずれかのステートメントに PREFETCHSIZE 文節を指定して、 定義することができます。 指定された値は、SYSCAT.TABLESPACES システム・カタログ表の PREFETCHSIZE 列に格納されます。
PREFETCHSIZE の値には、ユーザーの表スペースの EXTENTSIZE の値に表スペース・コンテナーの数を掛け合わせた値を、 明示的に指定することをお勧めします。 (エクステント・サイズは、別のコンテナーを使用する前に、 データベース・マネージャーがコンテナーに書き込むページ数のことです。 管理の手引き: 計画 の『表スペースの設計と選択』を参照してください。) たとえば、エクステント・サイズが 16 ページで、 表スペースがコンテナーを 2 つ持っていたとすると、 事前取り出し量は 32 ページに設定することができます。
データベース・マネージャーは、バッファー・プールの使用をモニターしているので、 データの事前取り出しを行ったために、別の作業単位で必要なページが、 バッファー・プールから除去されることはありません。 データベース・マネージャーは、問題を避けるために、事前に取り出すページ数を、 ユーザーが表スペースに関して指定した数量以下に制限することがあります。
事前取り出しサイズの設定値によっては、特に大きな表の走査時に、 パフォーマンスを大幅に向上させることができます。 ユーザーの表スペース用に指定された PREFETCHSIZE を調整するために、 データベース・システム・モニターおよび他のシステム・モニター・ツールを使用することができます。 たとえば、次のような情報を得ることができます。
照会時にデータの事前取り出しが行われているのにまだ入出力の待機時間が生じている場合は、 PREFETCHSIZE の値を増やしてみることができます。 ただし、事前取り出し以外の原因により入出力待機が生じていることもあり、 その場合は PREFETCHSIZE の値を増やしても照会のパフォーマンスは向上しません。
どのタイプの事前取り出しでも、事前取り出しサイズが表スペースのエクステント・サイズの倍数になっており、 表スペースのエクステントが別個のコンテナーにあるときには、 複数の入出力操作を並列に実行することができます。 パフォーマンスを向上させるには、 コンテナーが別個の物理装置を使用するように構成されていなければなりません。 並列事前取り出しに関する詳細については、事前取り出しおよび並列入出力を行うための入出力サーバーの構成を参照してください。
順次事前取り出しがパフォーマンスの向上につながるかどうかが、 瞬時には判断しにくい場合があります。 このような場合、データベース・マネージャーが入出力をモニターし、 ページが順次に読み取られている場合に事前取り出しを活動化することができます。 このように行う事前取り出しでは、データベース・マネージャーが事前取り出しを活動化すべきと判断したときは活動化し、 非活動化すべきと判断したときに非活動化することができます。 このタイプの順次事前取り出しのことを順次検出 といい、 索引ページとデータ・ページの両方に適用されます。 データベース・マネージャーが順次検出を実行するかどうかは、 seqdetect 構成パラメーター (順次検出フラグ (seqdetect)を参照) を使って制御することができます。 順次検出がオンになっている場合には、たとえば以下のような SQL ステートメントがあったとき、 そのステートメントに順次取り出しを用いると効果があると判別することができます。
SELECT NAME FROM EMPLOYEE WHERE EMPNO BETWEEN 100 AND 3000
この例の場合、最適化プログラムは、EMPNO 列の索引を使って表走査を実行することがあります。 この索引に関して表が高度にクラスター化されていると、 データ・ページの読み取りはほぼ順次になるので、 事前取り出しによってパフォーマンスが向上する可能性があります。 この場合、データ・ページの事前取り出しが行われます。
この例では、索引ページの事前取り出しが行われます。 大量の索引ページを検査する必要があるときに、 データベース・マネージャーが索引ページの順次ページ読み取りが行われていることを見つけた場合には、 索引ページの事前取り出しが行われます。
リスト事前取り出し またはリスト順次事前取り出しとは、 必要なデータ・ページが連続していない場合でも、効果的にデータ・ページにアクセスする方法の 1 つです。 リスト事前取り出しは、単一または複数の索引アクセスで用います。
事前取り出しは、 区画内並行操作 (索引または表の走査時に複数のサブエージェントを使用する操作) のパフォーマンスにとっては非常に重要です。 これらの並列走査によりデータの使用速度が高くなり、高速の事前取り出しが必要になります。
事前取り出しが不十分だと、順次走査よりも並列走査のほうがコストが高くつきます。 順次走査の実行時に事前取り出しが行われない場合には、 エージェントが常に入出力を待機しなければならないので、照会の実行速度が遅くなります。 並列走査の実行時に事前取り出しが行われない場合には、入出力を待機しているサブエージェントが 1 つあると、他のすべてのサブエージェントがそのサブエージェントを待機しなければならなくなります。
区画内並行操作の場合には事前取り出しの重要性が高いため、 並列操作はより積極的に実行されます。 順次検出機構は、隣接ページ間に大きなギャップがあってもそれを許容し、 それらのページは順次であるとみなされます。 ないものとして扱うギャップの幅は、 走査に関係するサブエージェントの数が多いほど大きくなります。