ビュー・オブジェクトのレンジ・ページングについて

ADFビジネス・コンポーネントのビュー・オブジェクト・コンポーネントでは、「RANGE_PAGING」というアクセス・モードがサポートされています。この機能では、アプリケーションはデータのページを前後に、1度に1レンジ移動でき、現在のデータ・レンジのみがキャッシュされます。これは、大容量のデータ・セットでの効果的なページング方法です。

レンジ・ページングを使用する場合

レンジ・ページングでは、ビュー・オブジェクト行を前後に移動する際、実行する問合せがより広範になる可能性があります。次のような場合は、レンジ・ページングを使用しない場合もあります。

非常に大容量(または予想不可能な大きさの)の行セットの場合、データベースからレンジ・サイズ行までを戻す問合せのみを少し多目に実行する方が、前に表示された行をすべてキャッシュするより、効果的な場合があります。これは、ユーザーに結果リストの任意のページへ移動を許可する場合に特に効果的です。標準モードでこれを行うと、現在のページとユーザーの移動先ページとの間ですべての行をフェッチし、キャッシュする必要があります。「RANGE_PAGING」モードでは、データベースにはそのページ上の行のみを要求します。その後、ユーザーがすでに移動したことのあるページへ戻る場合、「RANGE_PAGING」モードでは現在のページの行のみがメモリー内に保持されているため、これらの行は再度問合せる必要があります。

読取り/書込みアクセスおよび読取り専用アクセス

レンジ・ページングを使用する場合、データの変更が必要な場合、または表示のみの場合に応じて異なる2つのモードがあります。

読取り専用アクセスでは行は静的のままです。それに対して、行を作成または削除する場合は前後にスクロールする際にフェッチした行が異なります。

レンジ・ページングの機能

レンジ・ページングでは、「上位N番までの」問合せという機能を活用して、Oracleデータベースが、ある問合せで順序付けられた最初のN番目までの行を効果的に戻すことができます。たとえば、次のような問合せができます。

SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY SAL DESC

給料別で従業員の上位5人を検索する場合、次のような問合せを記述できます。

SELECT * FROM ( 
SELECT X.*,ROWNUM AS RN FROM (
SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) X) 
WHERE RN <= 5    
これによって次のような結果が得られます。
EMPNO     ENAME    SAL      RN
--------- -------- -------- ---------

7839      KING     5000     1
7788      SCOTT	   3000     2
7902      FORD     3000     3
7566      JONES    2975     4    

最も外側のWHERE句述語に含めたrownumパラメータのレンジを変更する場合、データベースがこの順序付けられたリスト内の行を検索するように要求できます。たとえば6から10番目を検索すると、次のようになります。

SELECT * FROM (
SELECT X.*,ROWNUM AS RN FROM ( 
  SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC ) X ) 
WHERE RN BETWEEN 6 AND 10    

これは、ページごとに行を表示し、現在はその結果セット・ページを表示する場合、次のような問合せを記述できることを意味します。

SELECT * FROM ( 
SELECT X.*,ROWNUM AS RN FROM ( 
SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC ) X ) 
WHERE RN BETWEEN ((:P -1_ * :R) + 1 AND (:P) * :R    

結果セットで取得する行が増えると、行を移動するためにこの技術を使用することがより効果的になります。その理由は、一般にデータベースから数百の行を取得する(特にSQL*Netから)のではなく、「R行/ページのページP」をデータベース内へ取り込むリクエストを「プッシュ」できるため、データベースはネットワーク全体の多くの行から数百行以上ではなく、1ページの行を戻すのみで済みます。

エキスパート・モードSQLを使用して前述のような問合せを入力でき、そこにバインド変数を入れられる一方、ユーザーに表示する現在のページと、現在のレンジ・サイズに基づいてそれらのバインド変数の値を自分で計算できます。これはADFビュー・オブジェクトを使用する方がより簡単です。

ADFビュー・オブジェクトのアクセス・モードが「RANGE_PAGING」に設定されている場合、VOでは次のような問合せが実行されます。

SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY SAL DESC

また、これを追加の外部SQLで前述の例と似た方法で自動的に「ラップ」します。バインド変数の値を計算(かつそれらを設定)するため、現在のレンジ・サイズに基づいて、データベースから現在のページ全体の行をフェッチして返します。

注意: このフレームワークでは、最適なパフォーマンスのためにBETWEENを使用するかわりに、「より大きい」と「より小さい」の条件を組合せ、ラップ表示の若干異なる問合せが作成されます。論理的な結果は前述のラップ問合せと同じです。次のベース問合せを「ラップ」するために生成される実際の問合せは次のとおりです。

SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY SAL DESC

次のように表示されます。

SELECT * FROM (SELECT /*+ FIRST_ROWS */IQ.*, ROWNUM AS Z_R_N FROM (
    SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY SAL DESC) IQ
    WHERE ROWNUM < :0)
    WHERE Z_R_N > :1    

ここでは、次の行番号の値をバインドします。

RANGE_PAGINGアクセス・モードでビュー・オブジェクトが動作する場合、ビュー行キャッシュのメモリーには1度に現在のレンジ(または「ページ」)の行のみが保持されます。すなわち、1度に結果10までをページングし、最初のページにいる場合、メモリーには行1から10までが保持されます。2ページ目に移動すると、キャッシュには行11から20までが保持されます。これは、大容量の行セットで単に多くの行をキャッシュするだけでなく、前後にスクロールする能力を残しておくことを保証することにも役立ちます。


問合せ結果間の移動方法