効果的な副照会の作成

副照会 とは、INSERT、UPDATE、MERGE、または DELETE SQL ステートメントの WHERE 文節または HAVING 文節内にある SELECT ステートメントです。 Db2 がどのように副照会を処理するかを理解することによって、複数のメソッドが同じ結果を得ることができる場合に、特定の照会を作成するときに使用する最良の方法を見積もることができます。

このタスクについて

プログラム固有のプログラミングインターフェース情報の開始。の場合、2つ以上の異なるSQLステートメントが同一の結果を得ることができます。特に、副照会を含むSQLステートメントは同じです。 ステートメントには異なるアクセス・パスはありますが、実行の方法は異なります。

副照会にも、独自の副照会が含まれる場合があります。 このようなネストされた副照会 は相関または相関解除される場合があります。 Db2 ネストされたサブクエリに対しては、ネストされていないサブクエリと同じ処理技術を使用し、同じ最適化技術が適用されます。

副照会をコーディングするかどうか、またはコーディングする方法を決定する場合の絶対的な規則はありません。 Db2 オプティマイザの推定値に応じて、ある種類のサブクエリが別の種類に変換される可能性があります。

プロシージャー

副照会を含む SQL ステートメントからの最高のパフォーマンスを確保するには、次のようにします。

以下の一般的なガイドラインに従います。
  • 副照会において、有効な索引がその表上で使用可能な場合、 相関副照会が最も有効な種類の副照会の可能性があります。
  • 副照会において、有効な索引がその表上で何も使用可能でない場合は、 非相関副照会の方が効果的に実行される可能性があります。
  • 複数の副照会がどの親照会の中にあっても、 副照会が最も効率的な方法で並んでいるか確認してください。

MAIN_TABLE が 1000 行であるとします。

SELECT * FROM MAIN_TABLE
  WHERE TYPE IN (subquery 1) AND
        PARTS IN (subquery 2);

副照会1および副照会2が同じタイプの副照会(相関関係または非相関)であり、副照会がステージ2であると仮定すると、Db2は、副照会述部を WHERE節に現れる順序で評価します。 副照会 1 は全体の行の 10% を拒否し、副照会 2 は全体の行の 80% を拒否 します。

  • 副照会 1 の述部 (P1 という) は 1000 回、 副照会 2 の述部 (P2 という) は 900 回評価され、 述部検査は合計 1900 回となります。 しかし、副照会の述部の順序が逆になると、P2 は 1000 回 評価されますが、P1 が評価されるのは 200 回のみで、 述部検査の合計は 1200 回となります。
  • P1 と P2 の実行時間が等しければ、P1 の前に P2 をコーディングした方が、 効率がよいと考えられます。 しかし、P1 の方が P2 よりも評価速度が 100 倍速ければ、 最初に副照会 1 をコーディングすることが得策の場合もあります。 パフォーマンス低下があるときは、副照会を並べ替えて、その結果を モニターするようにしてください。

    確信が持てないときは、相関副照会と非相関副照会の両方を指定した照会 で EXPLAIN を実行してください。 EXPLAIN 出力を調べ、データ分布と SQL ステートメントがわかれば、 どの形式がより効率的であるかを判断できるはずです。

    この一般的原則は、すべてのタイプの述部に適用できます。 しかし、副照会述部は、他のすべての述部に比べて、プロセッサーと入出力の使用が何千倍も集中する可能性があるため、副照会述部の順序は特に重要です。

指定された順序に関係なく、Db2は、副照会が結合に変換されない限り、相関副照会述部の前に非相関副照会述部を実行します。

プログラム固有のプログラミングインターフェース情報を終了します。