L
o
a
d
i
n
g
.
.
.

ホーム

お知らせ

製品・ソリューション

サービス

導入事例・パートナー

EXEM Academy・ブログ

会社情報

採用情報

2023.04.19

 SQLチューニング(第47回)

「 画面PAGINATION処理する時これは守ろう 」(1/7回)

今回のOracle SQLチューニングからは新シリーズがスタートします。
全7回シリーズで「画面PAGINATION処理する時これは守ろう」と題してお送りします。
まず第1回目となる今回は 『各論に入る前の概論について』説明していきたいと思います。

それで早速はじめましょう。

画面分割処理(PAGINATION処理)とは?

オンラインプログラムの中から抽出されたデータの件数が多すぎる場合、すべてのデータを一画面で表示させようと
するとDBに負荷が生じてしまうことがあります。

このようなプログラムでは、DBサーバから抽出されたデータは一度、WASサーバに取り込んだ後、クライアントPCへ
出力させています。このような処理は、DBサーバとWASサーバ間のネットワーク帯域が高負荷となるだけではなく
WASサーバの物理メモリも過剰に消費するため、その結果としてDBの性能問題が発生することに繋がってしまいます。

本来、オンラインプログラムは頻繁な照会と少ないデータ件数を抽出するため、WEB画面で構成されるのが一般的です。
照会頻度の高いプログラムが、多くのデータを1画面で出力されるように作成している場合、DBサーバとWASサーバの
両方に悪影響を及ぼす可能性があります。

従って、多くのデータを抽出するプログラムの場合、1画面にすべてのデータを表示させずにページを分割させて
最小データのみを表示させるように作成しなければなりません。これを 画面分割(Pagination)処理といいます。

 画面分割処理において知るべき重要な特性として、全データをページ単位で分割(以降ページ処理)させる際には、
 最初のページに表示させるデータは、業務処理時に最初に処理するデータでなければなりません。

 例えば、特定顧客の購入履歴を表示させる画面であれば、以前の購入履歴を表示するのではなく、最近購入した
 コンテンツを表示させたいと考えるはずです。
 そのためには、SQL作成時に購入日付で降順にソートした上で、ROWNUMを利用してデータ全体の必要な部分だけを
 切り出して画面に出力できるように作成するのが一般的です。



 このようなページ処理では、以下のように大きく2つの方法が多く使用されています

 まず最初に考えられる方法は、ページ処理時に1ページへ50行ずつ出力する場合、最初のページにはソート基準を
 満たすデータの中からROWNUM順番が抽出した1〜50までのデータを表示させ、2ページ目はROWNUM順番が
 抽出した1~100までのデータから51~100までのデータを画面に出力するようにSQLを作成します。
 しかし、このような方法で作成されたページ処理は、ページ番号が増えるほどSQLのパフォーマンスが低下します。
 その理由は、実際の1画面に表示させるデータは50件であるものの、ページ番号が増えるとROWNUMは全ページ分の
 データをすべて処理した後に再度50件分を表示させることになるからです。

 第2に考えられる方法は、最初の方法での非効率な部分を除去するためのSQLを作成する方法です。
 これは画面上にNEXTボタンを配置するのと同じ概念です。
 このページ処理では、ROWNUM が最初のページで表示させるデータとして順番に 1 ~ 50 までのデータを抽出した後
 2番目のページでは、1~50までのデータは抽出せずに 51 ~ 100 だけを抽出して表示します。
 この方法を取ることによって、最初の方法での非効率な部分を除去することができます。

 ただし、2番目の方法のように不要なデータを抽出せずに処理するには、最初のページのデータ(1〜50)を除外する
 別の条件をWhere句に追加しておく必要があります。
 そして、Where句に追加された条件によってSQLパフォーマンスに影響を与えてはいけません。
 従って、新しく追加する条件は、Order By句に適合し、既存のWhere句の条件と追加された条件の列が同じインデックス
 に含まれるようにインデックス構成を変更する必要があります。
 この前提条件を満たさなければ、必要なデータだけを抽出して処理することができません。

 つまり、最初の方法でSQLを作成する場合と比較すると、2番目の方法を適用することは困難です。
 WEB画面では、最初のページが最も頻繁に照会されることが多く、ページ番号が増加するほど照会される頻度が少なく
 なる傾向にあるからです。それらを考慮して考えた場合、最初の方法を適用することが多いと言えます。

 ここで注意すべきポイントがあります。
 上記のようなWEB画面で適用するページ処理では、画面照会時間や照会時に発生する負荷が少なくするように
 考えておく必要があります。
 この点を踏まえると、全データを全て読み込んだ後に処理する方法ではなく、全データから特定のページで表示させる
 データのみを処理(部分範囲処理)した後に、画面抽出ができるようにSQLを作成しなければならないのです。

 

 今回は「画面PAGINATION処理する時これは守ろう」の概論について説明してきました。
 いかがでしたか?次回からは、いよいよ本テーマの各論へ入っていきたいと思います。

SQLチューニングブログ(第47回) 終

次回ブログテーマ

「 ROWNUM処理を良くしよう 」

次回は「画面PAGINATION処理する時これは守ろう」の第2回目です。

PHP Code Snippets Powered By : XYZScripts.com