##Nested Loops解説
最初に結合アルゴリズムについて解説していきます。SQLの結合アルゴリズムで中でよく使われるのがNested loopsです。
Nested Loopsはプログラムのforの入れ子処理と全く同じです。
↓の図を見ると、テーブル1の最初のレコード(J1)が選択されて、それをテーブル2のレコードの行と一つずつ照らし合わせています。
それがおわったら次のレコード(J2)が選択されて、以下同様の処理がされます。
Nested Loopsではテーブル1を駆動表又は外部表、テーブル2を内部表と呼んでいます。
ここでパフォーマンスの鍵となるのは駆動表です。
次は駆動表について詳しく見ていきましょう。
##駆動表とパフォーマンス
一般的に駆動表はレコード数が少ないテーブルを使ったほうが良いです。
また結合する際は、内部表の結合対象のカラムにインデックスが付いていることを確認します。
インデックスを付けると駆動表のレコード一行に対して内部表のレコード一行が対応していれば、ループなしでその内部表の一行を特定することができます。図で説明すると↓になります。
青色部分のレコードはスキップされるので、内部表は2回のループだけで済みます。
##インデックスをつけてもパフォーマンスがでないとき
詳しくはインデックスの章で解説しますが、インデックスを有効に活用するには、インデックスをつけるカラムの選択率が低くカーディナリティが高いことです。選択率とは条件で絞り込んだあとのレコード数を指し、カーディナリティとは値のばらつきつまりカーディナリティが高いとは値がよくばらついているということです。
また、例えば店舗のテーブルを考えた時、大規模店舗の商品数と小規模店舗の商品数はかなり違います。そのようなテーブルでは小規模店舗で結合する場合は高速でアクセスできるのに対して、大規模店舗で結合したときはかなり遅くなってしまうということもありえます。そのときはあえて大きな駆動表(商品テーブル)をもってきて、店舗間によって処理スピードのばらつきをなくすという方法もあります。