DB検索時の各結合の違い



DB検索時の「ネステッドループ、マージ結合、ハッシュ結合」の違いについてです。

先にまとめ

簡易リファレンスとして利用しやすいよう、先にまとめておきます。

結合種類 ネステッドループ マージ結合 ハッシュ結合
処理概要 外部表を検索し、検索結果各行をループし、ひもづく内部表を1件ずつ検索 2表を別々に検索し、2表ともにソートし、突合せ 2表を別々に検索し、1表をハッシュにして突合せ
2テーブルの結合条件 等価結合以外もOK 等価結合以外もOK 等価結合のみ
一時領域の使用 少ない 多い 多い
最初の1件を返すまでの時間 速い やや遅い やや遅い
CPU負荷 低い やや高い 高い

各結合の特徴

各結合の特徴を箇条書きでつらつらと書き留めておきます。

ネステッドループ結合

  • 外部表を検索してループしながら内部表を1件ずつ検索
  • 等価結合でなくても利用できる
  • 一時領域の使用が少なめ
  • フェッチが始まるまでの時間が短め
  • 外部表の件数が少ない検索が有利
  • 2テーブルが大きい時には向かない
  • 等価結合でなくても利用できる
  • インデックスがあると効率的に検索できる
  • メモリに限りがあるときに有利
  • 検索結果の先頭行を素早く取得したい場合に有利
  • Oracle 11gで、複数件の内部表をまとめて検索する工夫が実装された
  • 処理時間目安:外部表のアクセス時間+(内部表1件のアクセス時間×外部表の抽出行数)

マージ結合

  • 2表を別々に検索し、2表ともにソートし、突合せ
  • 等価結合でなくても利用できる
  • 最初の1件を返すまでの時間がやや遅い
  • 2テーブルすべてのデータをメモリに乗せるので、一時領域の使用が非常に多い
  • ソートのコストが大きい
  • 2テーブルが非常に大きい場合メモリが足りれば有利
  • SQL Serverでは7以降で対応
  • 処理時間目安:2表のアクセス時間+2表のソート時間

ハッシュ結合

  • 2表を別々に検索し、1表をハッシュにして突合せ
  • 等価結合であることが必要
  • 最初の1件を返すまでの時間がやや遅い
  • 一時領域の使用が多め
  • データがメモリ上に収まらない場合には、分割し再帰的に処理
  • インデックスの有無は影響しない
  • ハッシュ計算のコストが高い
  • マージ結合と処理が近い
  • マージ結合より速い
  • 2テーブルが非常に大きい場合有利
  • SQL Serverでは7以降で対応
  • 処理時間目安:2表のアクセス時間+ハッシュ表の作成時間

参考
2016/09/05