とあるSQLにおけるSQLパフォーマンスチューニング LEFT JOIN句で条件指定 vs WHERE句で条件指定
抽出したい情報
・A_TBLにあって、B_TBLのCODEが'XXX'であるレコード
・A_TBLにあって、B_TBLにはないレコード
抽出したくない情報
・A_TBLにあって、B_TBLにもあるがCODEが'XXX'ではないレコード
(1)
select *
from A_TBL
left join B_TBL
on A_TBL.KEY=B_TBL.KEY
where (B_TBL.CODE='XXX' or B_TBL.CODE is null)
(2)
select *
from A_TBL
left join B_TBL
on A_TBL.KEY=B_TBL.KEY
and B_TBL.CODE='XXX'
where 〜
Oracle SQL Developer の自動トレース機能でSQL処理にかかった時間を調べる。
LAST_ELAPSED_TIME
前回の実行中の、この操作に対応する経過時間 (ミリ秒単位)
とあるSQLの計測結果
(1)
コスト: 4181
1回目: 2317288
2回目: 2293505
3回目: 2355084
(2)
コスト: 4191
1回目: 2191518
2回目: 2210278
3回目: 2193193
今回のケースでは、
(1)より(2)の方がコストは微増してしまうが、(2)の方が処理時間は若干早い
という結果になった。
コストと実測速度が反対の結果になるのは良くあること。
パフォーマンスチューニングは奥が深い。