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

今回の疑問

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

>>SQLが突然遅くなる原因と対応方法

>>ORACLEチューニング関連記事の一覧

例えば下のような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」で結合されるような実行計画になっているのでは。

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

プロが教えるORACLEの表や索引の断片化解消の見積り方法

今回の疑問

解決方法は・・・
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)
;



>>おすすめのORACLE参考書まとめ






OracleMasterExpertパフォーマンス&チューニングに一ヵ月で合格した勉強方法

【SQLでお困りの方にオススメ】
■SQLが遅くなる原因
・SQLが突然遅くなる原因と対応方法
・OracleSQLのレスポンスが遅い原因3つ
・JOINを使って表結合するとSQLが遅い!?
・SQLがパラレル実行されない原因

■SQLチューニングの基礎知識
・ORACLE SQLのヒントとは
・ORACLEのオプティマイザと実行計画について
・ORACLEのテーブルやインデックスの「統計情報」とは

■SQLチューニングの方法
・SELECT文のSQLチューニング方法
・OracleExadataでのSQLチューニング方法
・SLECT文が遅いときのインデックス作成によるチューニング方法
・INSERT文のSQLチューニング方法
・Update文が遅いときのチューニング方法
・Delete文が遅いときのチューニング方法
・IN句をEXISTS句に置き換えするチューニング方法
・OR句の置き換えによるチューニング方法
・IN句の置き換えによるチューニング方法
・テーブルアクセスフルスキャンを無くしてチューニングする方法
・SQLでGROUP BYが遅いときのチューニング方法
・SQLのソート処理が遅い場合のチューニング方法

■表や索引の断片化対策
・プロが教えるORACLEの表や索引の断片化解消の見積り方法
・ORACLE表の断片化を解消する3つの方法

■SQLのチューニングの補足情報
・ORACLE SQLヒントの書き方
・SQLに複数のヒントの書き方
・OracleSQLに実装すべき3つのSQLヒント
・ORACLE表の統計情報取得日の確認方法
・「統計情報が古い」とはどういうことか
・ORACLE表の統計情報の取得方法

【自己学習したい方にオススメ】
・自宅で勉強用にORACLEデータベースを無償でダウンロードし構築する方法
・OracleMasterGold12cに一ヵ月で合格した勉強方法
・OracleMasterExpertパフォーマンス&チューニングに一ヵ月で合格した勉強方法
・手に職がない人はIT業界へ、オススメ資格と勉強方法
・OracleDBのチューニング勉強方法
・OraclePL/SQL勉強方法