Db2が自動照会再書き込みを考慮する方法

一般的に、Db2は、照会ブロック・レベルでの自動照会再書き込みを考慮します。 読み取り専用の動的照会には、複数照会ブロックを含めることができます。

プログラム固有のプログラミングインターフェース情報の開始。 例えば、UNIONまたはUNION ALLのサブセレクト、一時的にマテリアライズされたビュー、マテリアライズされたテーブル式、サブクエリの条件などが含まれる場合があります。 Db2 クエリブロックが以下のいずれかの項目を含む場合、自動クエリ書き換えを行わずにクエリを処理します

  • UPDATE SET ステートメント内の全選択。
  • INSERT ステートメント内の全選択。
  • REFRESH TABLE ステートメント内のマテリアライズ照会表定義の中の全選択。
  • 外部結合。
  • EXTERNAL ACTION 属性または NON-DETERMINISTIC 属性を持つか、あるいは組み込み関数 RAND を含むユーザー定義のスカラー関数または表関数が含まれている照会ブロック。
  • パラメーター・マーカー

クエリブロックにこれらの項目が存在しない場合、 Db2 は自動クエリ書き換えを検討します。 Db2 ユーザークエリ内のクエリブロックと、マテリアライズドクエリテーブル定義内のフルセレクトを分析し、クエリを書き換えることができるかどうかを判断します。 マテリアライズ照会表には、Db2が照会を満たすために必要なソース表(列と行の両方)からのすべてのデータが含まれている必要があります。 Db2が再書き込み照会を選択するには、再書き込みされた照会で、ユーザー照会と同じ結果を提供する必要があります。(Db2は、マテリアライズ照会表に現行データが含まれているものと見なします。) さらに、再書き込みされた照会は、オリジナルのユーザー照会よりパフォーマンスが高くならなければなりません。

Db2は、マテリアライズ照会表からの照会の結果を取得できるかどうかを判別するために、高度な分析を実行します。

  • Db2は、マテリアライズ照会表にデータを取り込むために使用された基本表のセットを、ユーザー照会によって参照される基本表のセットに比較します。 これら 2 組の表が共通の基本表を共用している場合は、この照会は照会再書き込みの候補となります。
  • Db2は、マテリアライズ照会表の全選択の述部をユーザー照会内の述部と比較します。 この比較の結果は以下の要因によって決まります。
    • マテリアライズ照会表の全選択には、ユーザー照会の中にはない述部が含まれていることがあります。 その場合、Db2は、マテリアライズ照会表がリフレッシュされたときに、これらの述部が行を破棄した可能性があると想定します。 したがって、マテリアライズ照会表を使用する再書き込みされた照会は、正しい結果をもたらさない可能性があります。 この照会は照会再書き込みの候補にはなりません。
      例外: Db2 の動作は、述語が共通ベース・テーブルと、マテリアライズド・クエリ・テーブルfullselectに固有の追加テーブルを結合する場合に異なります。 2 つの基本表の間に参照制約を定義して、述部を無損失 としてある場合は、この述部が原因でデータの破棄が生じることはありません。 ただし、マテリアライズ照会表の全選択には、この追加の表を参照するローカル述部を組み込んではなりません。

      ロスレス述語の例については、「自動クエリ書き換え - 複雑な例 」の「例2」を参照してください。

    • ソース表についての参照制約は、自動照会再書き込みでマテリアライズ照会表を使用するかどうかを決定するための非常に重要な要因です。
    • ユーザー照会の中の述部を、マテリアライズ照会表の全選択の中の述部と同じかまたはよく似たものとしてコーディングしてあれば、述部は一致しやすくなります。 そうでない場合は、複雑な述部の場合にマッチング・プロセスが失敗することがあります。

      例えば、 COL1 = COL2COL2 = COL1 のような単純な等価述語のマッチング処理は成功します。 さらに、 COL1 * (COL2 + COL3) = COL5COL5 = (COL3 + COL2) * COL1 のような単純な等価述語の照合処理も成功します。 しかし、(COL1 + 3) * 10 = COL2COL1 * 10 + 30 = COL2 などの等価述部の間のマッチング・プロセスは失敗します。

    • IN リスト述部の中の項目は、正確に同じ順序になっていなくても、述部マッチングは正常に完了します。
  • Db2は、ユーザー照会内のGROUP BY節を、マテリアライズ照会表の全選択のGROUP BY節に比較します。 ユーザー照会が、マテリアライズ照会表の全選択の中のデータと同じかまたはそれより高いグループ化レベルのデータを要求している場合は、そのマテリアライズ照会表は照会再書き込みの候補として残ります。 Db2 この分析では、関数従属情報と列等価性を使用しています。
  • Db2は、ユーザー照会によって要求された列と、マテリアライズ照会表の列を比較します。 Db2 がマテリアライズドクエリテーブルの1つ以上の列から結果列を導出できる場合、マテリアライズドクエリテーブルはクエリ書き換えの候補のままとなります。Db2 この分析では、関数従属情報と列等価性を使用しています。
  • Db2は、ユーザー照会内の述部を、マテリアライズ照会表の全選択の述部と同一ではないものに検査します。 次に、Db2は、代わりにマテリアライズ照会表の列から基本表内の列への参照を派生させることができるかどうかを判別します。 Db2がマテリアライズ照会表から結果列を派生させることができる場合、マテリアライズ照会表は照会再書き込みの候補のままになります。

上記のすべての分析が成功した場合、 Db2 はユーザーのクエリを書き換えます。 Db2 ベーステーブルへの参照をすべて、または一部、マテリアライズドクエリテーブルへの参照に置き換えます。 Db2は、照会の書き直しに使用できるいくつかのマテリアライズ照会表を検出すると、複数の表を同時に使用する可能性があります。 Db2が表を同時に使用できない場合は、ルールのセットに従って使用するものを選択します。

新しいクエリを書き終えると、 Db2 は、そのクエリのコストとアクセス経路を決定します。 Db2 書き換えられたクエリの推定コストが元のクエリの推定コストよりも低い場合、書き換えられたクエリを使用します。 再書き込みされた照会は、マテリアライズ照会表内のデータが最新でない場合にのみ、概算結果を与える場合があります。プログラム固有のプログラミングインターフェース情報を終了します。