Db2 の結合操作の単純化方法
Db2 は、アクセス・パスの効率を向上させるために、結合操作を単純化することもあります。
ただし、完全外部結合は、左結合または右結合より効率的ではなく、左側と右側の結合は内部結合よりも効率的ではありません。これらの推奨は、照会で最も単純なタイプの結合操作を常に使用しようとすることです。
NULL 値を除去する述部の単純化
Db2は、結合操作によって生成されるNULL値を除去する述部またはON節が照会に含まれている場合に、結合操作を単純化することができます。- NULL 値を除去する ON 文節
次のような照会を行ったとします。
SELECT * FROM T1 X FULL JOIN T2 Y ON X.C1=Y.C1 WHERE X.C2 > 12;この外部結合操作により、以下のような結果表の行が得られます。
- 表 T1 および T2 (内部結合の結果) のマッチング値 C1 を持つ行
- C1 が T2 に対応する値を持たない場合の T1 からの行
- C1 が T1 に対応する値を持たない場合の T2 からの行
ただし、述部を適用する場合は、C1 が T1 に対応する値を持たない場合に T2 から 得られた結果表の行はすべて除去します。 Db2 フルジョインを左ジョインに変換し、より効率的になります
SELECT * FROM T1 X LEFT JOIN T2 Y ON X.C1=Y.C1 WHERE X.C2 > 12;- NULL 値を除去する述部
- 次のステートメントでは、右方結合から生じるすべての NULL 値を
X.C2>12述部で取り除いています。SELECT * FROM T1 X RIGHT JOIN T2 Y ON X.C1=Y.C1 WHERE X.C2>12;したがって、Db2は、結果を変更せずに、右結合をより効率的な内部結合に変換することができます。
SELECT * FROM T1 X INNER JOIN T2 Y ON X.C1=Y.C1 WHERE X.C2>12; - 結合操作を伴う述部
- 結合操作の後に続く述部は、Db2が外部結合をより単純な外部結合または内部結合に変換する前に、以下の特性を持っている必要があります。
- 述部はブール項述部であること。
- 1 つの表で結合操作によりすべての列が NULL 値になる場合は、 述部は偽であること。
以下の述部は、Db2が結合操作を単純化する可能性がある述部の例です。
T1.C1 > 10T1.C1 IS NOT NULLT1.C1 > 10 OR T1.C2 > 15T1.C1 > T2.C1T1.C1 IN (1,2,4)T1.C1 LIKE 'ABC%'T1.C1 BETWEEN 10 AND 10012 BETWEEN T1.C1 AND 100
- アンマッチの値を除去する ON 文節
- この例では、一致しない値を持つ行を除去するON文節が照会に含まれているため、Db2が結合操作を単純化する方法を示しています。
SELECT * FROM T1 X LEFT JOIN T2 Y FULL JOIN T3 Z ON Y.C1=Z.C1 ON X.C1=Y.C1;最後のON文節は、T1またはT2からの列値がNullである結果表からの行を除去するため、Db2は、同じ結果を得るために、完全結合をより効率的な左方結合に置き換えることができます。
SELECT * FROM T1 X LEFT JOIN T2 Y LEFT JOIN T3 Z ON Y.C1=Z.C1 ON X.C1=Y.C1; - 左外部結合として処理される全外部結合
- あるケースでは、Db2は、コードを書き込むことが出来ない場合に、全外部結合を左結合に変換します。 ビューで全外部結合を指定しても、そのビューでの後続の照会では
左外部結合しか必要としないような場合がこれにあたります。
例えば、以下のステートメントで作成されるビューについて考えてみます。
CREATE VIEW V1 (C1,T1C2,T2C2) AS SELECT COALESCE(T1.C1, T2.C1), T1.C2, T2.C2 FROM T1 X FULL JOIN T2 Y ON T1.C1=T2.C1;このビューには、T1 からの C2 の値が NULL であるような行が含まれています。 ただし、次の照会を実行すると、T1 からの C2 が NULL 値である行を除去することができます。
SELECT * FROM V1 WHERE T1C2 > 10;したがって、この照会の場合、T1 と T2 の間の左方結合は適切であったことに なります。 Db2 このクエリを実行すると、ビュー が左外部結合で生成されたかのように、クエリがより効率的に実行されます。 V1
左外部結合における不要な表の削除
SQLステートメントに左外部結合が含まれているが、結合の右側から列が選択されていない場合、Db2は、その結合をステートメントから除去することができます。
以下の条件のいずれかに該当する場合、右表は不要です。
- 右表の結合キー列に、ユニーク索引が存在する。
- ステートメントで SELECT DISTINCT を指定している。
例えば、次のステートメントを考慮してください。
SELECT DISTINCT T1.C3
FROM T1 LEFT OUTER JOIN T2
ON T1.C2 = T2.C2
WHERE T1.C1 = ?ステートメントでSELECT DISTINCTが指定されているため、右表への参照は不要であり、Db2は、代わりに以下のステートメントのアクセス・パスを選択することができます。
SELECT DISTINCT T1.C3
FROM T1
WHERE T1.C1 = ?右表への参照がステートメントからすべて削除されたため、ステートメントの PLAN_TABLE 出力およびアクセス・パス図には、その表への参照が含まれません。