結合方法
オプティマイザは複数の結合方法のいずれかを選択できます。2つの表の行を結合する場合は、一方の表を外部表、他方の表を内部表に指定します。オプティマイザは、どちらの表を外部表にしてどちらを内部表にするかを決定します。結合中に、オプティマイザは外部表と内部表の行をスキャンして、結合条件に一致する行を検索します。
オプティマイザは各表の統計を分析します。たとえば、オプティマイザは、最小の表、または問合せについて最高の選択性を持つ表を外部表として識別します。結合する1つ以上の表に索引が存在する場合、オプティマイザでは外部表と内部表を選択する際にそれらを考慮します。
3つ以上の表を結合する場合、オプティマイザは表のペアについて様々な結合の組合せを分析し、最初に結合するペア、次にその結合の結果によって結合する表など、最適な結合の順序を判断します。
結合のコストは、内部表と外部表にアクセスして、結合条件に一致する行を検索する方法に大きく影響されます。オプティマイザは、問合せオプティマイザ計画を決定する際に2つの結合方法から選択します。
ネステッド・ループ結合
索引のないネステッド・ループ結合では、外部表の行が一度に1行ずつ選択され、内部表のすべての行と一致するか確認されます。内部表のすべての行が、外部表の行数と同じ回数スキャンされます。
内部表の結合列に索引がある場合、その索引は結合条件を満たす行の選択に使用されます。各表から結合条件を満たす行が返されます。処理中に、索引がネステッド・ループの内部表に対して作成され、内部スキャンの結果が結合の前にマテリアライズされる可能性があります。
図5-2に、ネステッド・ループ結合の例を示します。結条件は次のとおりです。
WHERE t1.a=t2.a
この例では、オプティマイザはt1
が外部表、t2
が内部表と決定しています。表t2
内の列a
の値と一致している表t1
内の列a
の値は1および7です。結合の結果、t1
およびt2
の行が連結されます。たとえば、最初の結合結果は次の行になります。
7 50 43.54 21 13.69
次のt1
の行が連結されます。
7 50 43.54
列a
の値が一致しているt2
の最初の行を次に示します。
7 21 13.69
マージ結合
マージ結合は、結合列が範囲索引でソートされる場合にのみ使用されます。マージ結合では、カーソルが各索引を一度に1行ずつ進みます。行はすでに各索引の結合列でソートされているため、簡単な式を適用することにより、単一のスキャンでカーソルが各行を効率的に進みます。式は次のようになります。
-
内部.結合列 < 外部.結合列の場合、内部カーソルを進める
-
内部.結合列 = 外部.結合列の場合、一致を読み取る
-
内部.結合列 > 外部.結合列の場合、外部カーソルを進める
ネステッド・ループ結合と異なり、外部表の各行について内部表全体をスキャンする必要はありません。マージ結合が使用できるのは、問合せを準備する前に表に範囲索引が作成されている場合です。問合せを準備する前に、結合する表に範囲索引が存在しない場合、状況によっては、オプティマイザがマージ結合を使用するために、一時範囲索引を作成する可能性もあります。
図5-3に、マージ結合の例を示します。結条件は次のとおりです。
WHERE t1.a=t2.a
x1
は、表t1
の索引を列a
でソートしたものです。x2
は、表t2
の索引を列a
でソートしたものです。マージ結合の結果、x1
の行は、列a
の値が一致するx2
の行と連結されます。たとえば、最初のマージ結合の結果は次のようになります。たとえば、最初のマージ結合の結果は次のようになります。
1 20 23.09 20 43.59
次のx1
の行が連結されます。
1 20 23.09
列a
の値が一致しているx2
の最初の行を次に示します。
1 20 43.59