結合種類について理解しよう。
1.ネステッド・ループ結合
●直訳
「入れ子の繰り返し」
●ざっくり説明
外部テーブルを行ループし、内部テーブルを走査する結合方法。
●使用に適した状態
WHERE句で条件が絞り込まれた後、テーブルの一部分を結合する場合。(外部テーブルのレコード数が絞り込まれている場合)
内部テーブルの結合列にインデックスが張られている場合。
※「外部テーブル」・・・結合の基準となるテーブル。駆動テーブル。
「内部テーブル」・・・外部テーブル以外。
●結合順序
(2)外部テーブルのレコード毎に内部テーブルにアクセスし、結合条件を検査 「①~⑧の順で走査」
※外部テーブルの各レコード走査は、内部テーブルの1行目から開始される。
(3)結果返却
●使用時の注意点
(1)結合順序が大切
外部テーブルはレコード数の少ない方にする。レコード数が同じぐらいの場合は効率的なインデックスが張られている方を内部テーブルにする。
(2)内部テーブルのインデックスが大事
内部テーブルへのアクセスはインデックススキャンを使用しないと負荷が高い
(3)外部テーブルのレコード数が多いと効率的ではない
2.ソート/マージ結合
●直訳
「並べ替え/融合」
●ざっくり説明
2つのテーブルを並べて、上から順に一致する行を走査する結合方法。
●使用に適した状態
両方のテーブルの結合列にインデックスが張られている場合。
●結合順序
(1)両方のテーブルを結合列でソートする
(2)順番に結合条件を検索し、マージする
※2つのテーブルを並べてキー列の同値を合わせるイメージ
(3)結果返却
●使用時の注意点
(1)ソートにかかるコストが見合うか判断が必要
結合列にはインデックスが張られていることが望ましい。外部テーブルのレコード数が少ない場合はソートにかかるコストが相対的に大きくなり、ネステッド・ループ結合の方が効率がいい場合がある。
3.ハッシュ結合
●直訳
「ごちゃまぜ」
●ざっくり説明
片方のテーブルをハッシュテーブルとして、メモリに格納してから走査する結合方法。
●使用に適した状態
結合条件に等価条件が指定され、かつ 大量のレコードを結合する場合。
●結合順序
(1)レコード数の少ないテーブルに対しハッシュテーブルを作成し、メモリ内に保持する
(2)もう一方のテーブルの結合列をハッシュ関数でハッシュ値に変換する。
(3)ハッシュ値同士で結合条件を検査
●使用時の注意点
(1)メモリに余裕があること
メモリが不足するとパフォーマンスが低下する。
(2)結合条件は等価条件(=)のみ
ハッシュ値で結合するため、非等価結合や範囲条件による結合はできない。