【ねすてっどるーぷけつごう】
ネステッドループ結合 とは?
公開:
💡 1行ごとに、相手を探す
外側の入力を1行ずつ取り出し、その行に合う相手を内側の入力から探す結合方式。内側を毎回全走査する場合と、索引で探す場合では費用が大きく異なる。
📌 このページのポイント
- 外側の各行に対して、内側から条件に合う行を探す
- 内側を毎回全走査すると、単純な比較回数は外側件数×内側件数になる
- 内側の索引を使える場合は、各行のキーで候補を絞り込める
- 外側の件数、索引の有無、一致件数、キャッシュなどで性能が変わる
入れ子のループってどういうこと?
外側の表から1行取り出すたびに、内側の表から相手を探す動きを繰り返すんだ。注文ごとに顧客情報を探すようなイメージだよ。
毎回すべての行を探すの?
単純な方式ではそうなるね。外側が2行、内側が3行なら、全組み合わせは2×3=6回。ただし、実際の計画がいつも全走査になるわけではないよ。
索引を使えばよいのかな?
内側の結合キーに使える索引があれば、外側の行ごとに索引で候補を探せるよ。外側が十分に少なく、相手も少数に絞れる場合には効率的なんだ。索引を使う検索1回の費用が一定という意味ではないよ。
たくさんの行を結ぶときは苦手なの?
外側が多いと、内側への検索回数が増える。索引があっても、各検索で大量の行に当たれば重くなるよ。予想より外側の行が多かったために、この方式が遅くなることもあるんだ。
実行計画のどこを見ればいいの?
外側の実際の行数、内側の繰り返し回数、1回に返す行数を見よう。単にNested Loopという名前だけで悪い計画と決めず、どの入力が何回読み直されているかを確かめるとよいね。
まとめ:ざっくりこれだけ覚えればOK!
「ネステッドループ結合」は「1行ごとに、相手を探す」と押さえておこう!
📖 おまけ:英語の意味
「nested loop join」 = 入れ子のループによる結合
💬 nested loop joinは「入れ子のループによる結合」という意味の表現だよ。