手軽に使えるのですがエンジニアの間でも意外と知られていないSQLの活用法をご紹介します。
通常のJOINのON句の使い方
JOINのON句は以下のように結合条件のために普通は使うと思います。
1 2 3 4 |
select * from A LEFT JOIN B ON A.カラム1 = B.カラム1 |
それで結合後に条件を絞りたい場合は、以下のようにするでしょう。
1 2 3 4 5 |
select * from A LEFT JOIN B ON A.カラム1 = B.カラム1 WHERE B.カラム2 = "XXX" |
「結合条件」と「抽出条件」を区別すること
ただ、これはON句で同じことを書けます。
1 2 3 4 5 |
select * from A LEFT JOIN B ON A.カラム1 = B.カラム1 AND B.カラム2 = "XXX" |
ON句の仕様として片方のテーブルにしか関係ない条件を指定した場合は片方のテーブルの抽出条件になります。
この記述だとAテーブルを必要としないので先にBテーブルの件数を減らす挙動になります。その後、「ON A.カラム1 = B.カラム1」というテーブルAとテーブルBどちらにも関係する結合条件が動作するため処理がテーブルBの対象件数が減るためパフォーマンスが向上します。(SQLのオプティマイザの仕様としては、ON句の後にwhere句が動く仕様になっているため。)
on句ではなくwhere句に抽出条件を書いてしまう書き方だとテーブル同士を結合した後に、where句で絞る動作になるので仮にテーブルBが大きいテーブルだった場合はかなり結合処理が重くなってしまいます。
抽出条件に使うのであれば、できるだけWHERE句ではなくON句を活用するのが良いSQL設計になります。
「ON句には結合条件を書いて、where句で結合結果を抽出する。」みたいな文法の意味だけ考えているとなかなかこの事実には辿り着かないので現場のエンジニアの人でも意外と知らない人が多いある種裏技と言えるかもしれません 笑
また、近年はRailsなどのフレームワークなどをORマッパーを使った開発が一般的になってきておりもしかしたらフレームワークによってはデフォルトでは使えないかもしれませんが、もし劇的にパフォーマンスが改善されるようであればその部分だけ部分的にwhere条件をON句に移動させるようにしても良いかもしれませんね。
この記事へのコメントはありません。