潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

とある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)の方が処理時間は若干早い

という結果になった。

 

コストと実測速度が反対の結果になるのは良くあること。

パフォーマンスチューニングは奥が深い。