
Oracle SQLチューニング(第16回)「WITH節理解と効率的なSQLの作成」(1/3)
今回からWITH節に関する考察が始まります。今回は、その1回目として「WITH節動作方式を理解すること」をお送りします。では早速始めましょう。
4.WITH節理解と効率的なSQLの作成
With節は同じデータを繰り返し読まなければならないSQLの性能を改善するための方法でたくさん使われる。 一般的にWith節を使えば常にGlobal Temporary Tableを生成した後に抽出された結果セットを保存して、この保存されたデータをSQLで使うことで正しく知らない場合が多い。
しかし、With節はGlobal Temporary Table (Materialize)を使う方式の他にInline View方式でも実行される。 それぞれの動作方式に対する説明は以後に詳しく説明する。
11g以前のバージョンではWith節に対してInline View動作方式を選択するのか、Materialize動作方式を選択するのかに対する判断をOptimizerが決めるが、その判断基準はWith節がSQLで実行される回数である。 With節で抽出した結果セットをSQLで2回以上実行する場合Materialize動作方式を、1回だけ実行する場合Inline View動作方式で実行する。 With節は状況によって動作方式が二種類に分かれるので、SQL性能と密接な関連がある場合には使用者が強制的に動作方式を調節する必要がある。 With節動作方式を調節するヒントはINLINEとMATERIALIZEがある。 11gでは隠しパラメーターである”_WITH_SUBQUERY”によっても制御が可能である。
4.1 WITH節動作方式を理解すること
4.1.1 MATERIALIZE動作方式
Materialize動作方式は先にGlobal Temporary Tableを生成した後、With節で抽出した結果セットを保存する。 そしてMain SQLでWith節を呼び出せば、抽出した結果セットが保存されているGlobal Temporary Tableを読んでデータを処理する。 理解を助けるためにテストを通じて調べてみる。 まずテスト スクリプトを実行する。
前で説明したようにOptimizerはWith節で抽出した結果セットをSQLで2回以上使ってこそMaterialize動作方式で処理する。 しかし、上の例題SQLはWith節T_T1,T_T2に対する照会がそれぞれ1回だけ実行されたのでMaterialize動作方式でないInline View動作方式で実行された。 するとWith節にMATERIALIZEヒントを付与すればどうなろうか? 直接ヒントを付与して実行してみよう。
With節をSQLでそれぞれ1回使ったが、MATERIALIZEヒントを付与するとすぐにGlobal Temporary Tableを利用するMaterialize動作方式で実行されたのを確認することができる。
4.1.2 INLINE VIEW動作方式
Inline View動作方式はWith節で抽出した結果セットをSQLで1回使われる場合Global Temporary Tableを使わないで、Inline View方式で実行される方式である。 以下の例題を通じて詳しく調べてみる。
上記SQLはWith節T_T1,T_T2がそれぞれSQLで2回以上使われて、Materialize動作方式で実行された。 しかし、INLINEヒントを付与すれば実行計画にどんな変化がおきるだろうか? 直接ヒントを付与して実行計画を確認してみよう。
INLINEヒントを付与して、With節は既存のMaterialize動作方式がInline View動作方式に変更された。 今まで基本的なWith節の動作方式とこれを制御できるヒントに対して調べてみた。 以降With節がSQLの性能を改善する目的でどのように活用できるのか調べてみることにしよう。
今回は、ここまでです。本文にある通り次回は、W ITH節の活用について考察します。ご期待ください。See You^^