0

私は次の「ワッパー」を使用して、いくつかの場面でページ付けを実装しました。これは、「標準のページング選択」と呼ばれることがよくあります。したがって、selectステートメントの結果をページ分割するには、selectステートメントを「標準のページング選択」でラップするだけです。

    SELECT * FROM (SELECT a.*, ROWNUM rnum FROM ((


    ( subquery:  put your select * from .......  here ..)


)) a WHERE ROWNUM  <=  ${resultEnd} ) 
WHERE rnum  >=  ${resultStart}

私の質問は、ページングビットの動作とROWNUM周辺の魔法に関するものです。私の理解では、サブクエリは毎回完全な結果セットを選択するわけではなく、確認などを探していましたか

次のとおりです。たとえば、ページサイズが50の場合、上記のページング動作の正しい説明は次のとおりです。

選ぶ:

  • ページ1(例:0-50)サブクエリは0-50行を選択します
  • ページ2(例:51-100)サブクエリは0-100行を選択します(外部クエリは50-100に制限します)
  • ページ3(例:101-150)サブクエリは0-150行を選択します(外部クエリは101-150に制限します)
  • ページ4(例:151-200)サブクエリは0-200行を選択します(外部クエリは151-200に制限します)
  • 5ページ(例:201-250)サブクエリは0-250行を選択します(外部クエリは201-250に制限します)

...など、パターンを見ることができます。

「ページ」に進むほど、サブクエリで実行する必要のある作業が増えます。これは正しいです?もしそうなら、ROWNUMはこれをどのように行いますか?

前もって感謝します。そしてフィードバックをいただければ幸いです

4

2 に答える 2

1

あなたの理解は一般的に正しいです。内部は、行rownum <= endを生成すると内部クエリを「中断」しend、外部rownum >= startは最初の行を破棄します。

rownumはオンザフライで生成され、オプティマイザはrownum <フィルタを認識しているため、行ソースに影響を与えて短く停止することができます(Explainプランで行を探してCOUNT STOPKEYください。これが機能するかどうかがわかります)。

しかし、内側の選択が短く停止するという保証はありません。特に、order byそこにある句は結果セット全体を強制的に生成する可能性があり、rownumフィルターはその間隔外で生成された行を単に破棄します。

于 2013-03-13T16:50:59.797 に答える
0

クエリに適切なインデックスが付けられ、パフォーマンスが高い場合は、マテリアライズドビューを使用してみませんか?rownumを列として定義し、オンデマンドでビューを更新できます。また、注意が必要です。Oracle12Cには、ページネーションタイプのクエリに対する優れたサポートが付属しています。

于 2013-03-13T18:25:23.800 に答える