chanting an air of joyous bliss

普段の生活で見逃しがちな面白いことを書いていく
そんなブログです

Oracle11g→12cへ移行した際の実行計画の変動について

2018-10-30 22:43:25 | コンピュータ・プログラミング

Oracle11g→12cへ移行した際に同一SQLが移行前後で劣化していないか検証しているのだが、実行計画がHashJoin結合からNestedLoop結合変更されているケースがちらほら散見されている。
一般的にHashJoin結合とNestedLoop結合を比較した場合、駆動表となるテーブルのレコード数が少ない場合はNestedLoop結合が、多い場合はHashJoin結合が有利になる。
11g→12cで実行計画がHashJoin結合からNestedLoop結合変更になったことでSQLの実行が早くなったものもあれば遅くなったものあるが、色々検証した結果、今回の実行計画の変動は正直、NestedLoop結合になったことによるメリットより、デメリットのほうが上回る結果となった。
というのも既存のSQLはNestedLoop結合になるようにチューニングされており、実行計画がHashJoin結合なるSQLは,例えばレコード数が多いテーブル同士の結合、でNestedLoopが不利になる類のものしかないからだ
例えば

select * from b main where b.aaa = (select max(c) from b sub where main.ccc = sub.ccc)

というようなSQLがあった場合、bのテーブルのレコード数が十分に小さければNestedLoop結合が有利になるが、bのテーブルのレコード数が多い場合はHashJoin結合が有利になる
今回、性能が劣化したSQLは上記の例のSQLでいうと「bのテーブルのレコード数が多い場合」に該当するもので、11g上での実行計画はHashJoin結合だった。12cでNestedLoop結合になったことで、自己結合のクエリがいわば直積に近い結合をしてしまい、ひどいものになると11gでは30秒で終わっていたSQLが2400秒近くかかるようになっていた。
12cで何でもかんでもNestedLoopになってしまったのはちょっと謎だ

コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« iPhone関連 | トップ | 10月30日(火)のつぶやき »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コンピュータ・プログラミング」カテゴリの最新記事