JOINを使って表結合するとSQLが遅い!?

今回の疑問

どうもORACLEでSQLを書いていてINNER JOINやOUTER JOINを使って表結合を行うと
WHERE句で単純に結合した場合よりも遅くなることがある気がします。
元々私はJOINではなく、(+)で外部結合していた世代なので、知識が不十分。

例えば下のようなSQLです。

select
  a.id
  ,b.div_cd
  ,b.div_nm
from
  table1 a
  ,table b
where
  a.id = ‘100’
  and a.div_cd = b.div_cd
;

これをJOINで書くとこんな感じ。というかこんな感じのプログラムがよくあります。
結果は変わらないのですが、どうも上のSQLよりも遅いことがよくあります。

select
  a.id
  ,b.div_cd
  ,b.div_nm
from
  table1 a
  inner join table b
    on (a.div_cd = b.div_cd)
where
  a.id = ‘100’
;

SQLが遅くなる原因

あまりJOINのことを知らないので、あくまで仮説ですが
上の例だと「a.id = ‘100’」という条件の絞り込み前に、ONに書かれた条件で結合されているんじゃないだろうか。

というのも、ORACLEオプティマイザがSQLを評価するときの順序が、FROMが一番初めのはず。
ということはFROM,WHEREの順で評価されるのでWHERE句に書かれた「a.id = ‘100’」の絞り込み前に
FROM句のON「a.div_cd = b.div_cd」で結合されるような実行計画になっているのでは。

正解は、、、今度、実機検証してみます。

今回の疑問

解決方法は・・・
JOINを使わないこと!って書くと色々問題ありそうなので、JOINを使う場合に下記のような書き方にしてみることをオススメします。
ONの条件に「a.id = ‘100’」を追加してみましょう。
きっとこれで解決するパターンもあるはず。。

select
  a.id
  ,b.div_cd
  ,b.div_nm
from
  table1 a
  inner join table b
    on (a.id = ‘100’
      and a.div_cd = b.div_cd)
;

【こちらもオススメ】
・OracleSQLのレスポンスが遅い原因3つ
・SQLが突然遅くなる原因と対応方法
・ORACLE SQLのヒントとは
・ORACLE SQLヒントの書き方
・SQLに複数のヒントの書き方
・OracleSQLに実装すべき3つのSQLヒント
・ORACLEのオプティマイザと実行計画について
・ORACLEのテーブルやインデックスの「統計情報」とは
・OracleSQLの実行計画を取得する方法
・JOINを使って表結合するとSQLが遅い!?
・インデックスによるSQLチューニング(カバーリングインデックス)
・プロが教える本番環境に影響を与えずに索引を検証する方法
・SQLでGROUP BYが遅いときのチューニング方法
・Update文が遅いときのチューニング方法
・Delete文が遅いときのチューニング方法
・ORACLEバッチ処理SQLチューニング方法3つ
・OracleSQLを変更せずにソートをチューニングする方法
・Oracle無駄をなくしSQLを高速化する方法
・Oracleのパフォーマンスを左右する待機イベント
・ORACLE表の断片化を解消する3つの方法
・プロが教えるORACLEの表や索引の断片化解消の見積り方法
・OracleDBのチューニング勉強方法
・OracleMasterGold12cに一ヵ月で合格した勉強方法
・OracleMasterExpertパフォーマンス&チューニングに一ヵ月で合格した勉強方法
・自宅で勉強用にORACLEデータベースを無償でダウンロードし構築する方法