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
|