
Oracle SQLチューニング(第50回)「画面PAGINATION処理する時これは守ろう」(4/7回)
今回のOracle SQLチューニングは、「 画面PAGINATION処理する時これは守ろう 」の第4回目です。
「 PLANに現れるオペレーション中、COUNTに騙されないでおこう 」と題してお送りします。
それでは早速はじめましょう。
13.3 PLANに現れるオペレーション中、COUNTに騙されないでおこう
部分範囲処理がされるように誘導するページ処理は、適切なROWNUM処理とOrder By節、Where節、インデックス構成情報が適切であり、テーブル間結合方式がNested Loops Joinで実行されるのであれば効率的な実行が可能です。
“ 13.1 ROWNUM処理をよくしよう ” で説明した 部分範囲処理が不可能な例 の場合と共に適切でないROWNUM処理をしてもWhere節、インデックス構成情報とOrder By節の整列基準が合えば、SORT ORDER BYオペレーションが現れずに、COUNTオペレーションが見えてきます。 COUNTオペレーションがあたかも全体データ処理をせずに実行されているように見えますが実際には、全体データを全部処理した後に ROWNUM を実行することになるので注意しなければなりません。
以下の事例を通じて確認してみましょう。
上記トレース結果を見ればROWNUM条件で範囲を問い合わせて非効率的に処理されています。
しかし、Where節のインデックス構成情報とOrder By節が適切に構成されている SORT ORDER BYオペレーションではないCOUNTオペレーションがあるのを確認することができます。
この時、COUNTはCOUNT STOPKEYとは違うように全体データを全部処理するので非効率的に実行されます。
これを効率的なページ処理で実行されるようにするためには、先立って“ ROWNUM処理をよくしよう ” で説明したようにRNUMを置き換える前に:B3値に該当するデータだけを持ってくるようにROWNUMに条件を追加する必要があります。
次回のブログは「画面PAGINATION処理する時これは守ろう 」の5回目です。
それでは See you next time!!