
Oracle SQLチューニング(第53回)「画面PAGINATION処理する時これは守ろう」(7/7回)
今回のSQLチューニングは、「画面PAGINATION処理する時これは守ろう」の最終回です。
「基本的な方式のPAGINATIONを学ぼう」をお送りします。
それでは早速はじめていきましょう。
13.6 基本的な方式のPAGINATIONを学ぼう
以前に紹介した「 ページ処理の際に知っておくべき必須要件 」をもとに、効率的なページ処理を実行することができるSQLを作成する過程を一緒に見ていきましょう。
このプロセスをきちんと理解することで、ページ処理に関するより深い理解を得られる機会になることを願っています。
以下の記載例は、性能問題があるSQLの影響で、正常なページ処理が行われなかったオンライン画面です。
このケースでのページ処理は、WEBサーバー側が担っているものと仮定した上で話を進めます。
この様な状態にあるSQLは、非効率なプロセスが多く実行されるために性能問題が生じる結果を招きます。
正しいSQLを作成して、効率的なページ処理が実行されるようにしていきましょう。
性能問題があるSQL(例)
●SQL分析結果
[A],[B],[C],[D]から[E]を分析
分析結果 → 正常なページ処理が行われずに全データを抽出したことで非効率な処理が発生した。
性能問題のあるSQLが、DBサーバーから599件分の全データを抽出したオンライン画面です。
抽出された全データは、SQLがそのままWASサーバーへ伝送をします。
WASサーバーは、受け取った全データの中からクライアント画面に表示するために必要なデータだけを再抽出してクライアント側へ送信します。この状態の場合、DBサーバーは「効率的なページ処理(部分範囲処理)」は実行しません。
しかし、実際のクライアント画面では 「 ページ処理がされた状態のデータ 」 を見ることができます。
次に、性能問題のあるSQLでページ処理を進めた場合と、正常にページ処理が実行できるSQLを作成した場合でどの程度の性能差が発生するのか?を分析していきましょう。
誤ったページ処理[1]
ROWNUM処理とORDER BY節を間違って使った場合 (実行計画:SORT ORDER BY -> COUNT)
[A] WHERE照会条件
[B]インデックス構成情報
[C] ORDER BY (整列基準)
[D] ROWNUM処理
[E] PLAN上OPERATION
誤ったページ処理[1]の改善前SQL
誤ったページ処理[1]の改善後SQL
誤ったページ処理[2]
ROWNUM処理は効率的やORDER BYを間違って使った場合 (実行計画:SORT ORDER BY STOPKEY -> COUNT STOPKEY)
ROWNUM処理は効率的やORDER BYを間違って使った場合(実行計画:SORT ORDER BY STOPKEY -> COUNT STOPKEY)
[A] WHERE照会条件
[B]インデックス構成情報
[C] ORDER BY (整列基準)
[D] ROWNUM処理
[E] PLAN上OPERATION
● SQL分析結果
[A],[B],[C],[D]から[E]を分析
SORT ORDER BY STOPKEY − ORDER BY節義順序がインデックス カラム順序に非適合
COUNT STOPKEY − ROWNUM処理が適合( 部分範囲処理される方式 )
誤ったページ処理[2]の改善前SQL
誤ったページ処理[2]の改善後SQL
誤ったページ処理[3]
ROWNUM処理が誤った場合(実行計画:COUNT [SORT ORDER BY(X)] )
[A] WHERE照会条件
[B]インデックス構成情報
[C] ORDER BY (整列基準)
[D] ROWNUM処理
[E] PLAN上OPERATION
● SQL分析結果
[A],[B],[C],[D]から[E]を分析
ページ処理結果 → ページ処理が非効率(下のPLANのオペレーションで判断)。
COUNT? PLANにSORT ORDER BY[STOPKEY]なしにCOUNTだけある場合は、ORDER BY節のカラム順序とインデックス構成情報は効率的でも、ROWNUM処理が誤っている時見えるオペレーションで部分範囲処理されない。
誤ったページ処理[3]の改善前SQL
誤ったページ処理[3]の改善後SQL
[ 改善後SQL ]
[A] WHERE照会条件
[B]インデックス構成情報
● SQL分析結果
[A],[B],[C],[D]から[E]を分析
ページ処理結果 → 効率的なページ処理が実行されたCount STOPKEY PLANに「SORT ORDER BY [ STOPKEY ]」が無い状態で、COUNT STOPKEYだけがある場合、 ROWNUM処理とORDER BYの構成などが皆適合して効率的なページが処理される場合がある。
● まとめ
今回のSQLチューニングでは、性能問題のあるSQLが部分範囲処理が実行できるようになり、効率的なページ処理が行われるようにSQLの作成をする方法を調べてきました。 ROWNUM処理、Where節条件、Order By節、そしてインデックス構成は、効率的なページ処理における必須要件です。
そして、Where節とOrder By節を実行するテーブルはDriving Tableでなければなりません。
又、結合させる場合には、Nested Loops Joinで実行する必要があります。 ここまでの内容を読んだ読者の方には、もしかするとページ処理は非常に簡単ではないか?と考える方もいるかと思います。
しかし、ページ処理の基本と核心を完ぺきに理解せずにいると、誤ったページ処理をSQLに適用させてしまいます。 その結果、とんでもないデータが出力されたり、予期せぬ非効率なプロセスを発生させる原因となり、DBサーバーに性能問題を引き起こす可能性が出てきますので注意しましょう。
さらにページ処理は決して簡単に理解できる内容ではありません。
几帳面で深みある理解を基本としてSQLを作成する必要があると思います。
全53回でお届けしてきました「SQLチューニングブログ」は今回で終了となります。
ご愛読いただきまして誠にありがとうございました。
新シリーズがスタート!
「 SQLチューニング 2nd シーズン 」
それでは See you next time!