sql >> データベース >  >> RDS >> Oracle

Oracleページネーション戦略

    ページネーションを行うたびに「X」と「Y」を調整する予定があるかどうかはわかりませんでした。そうしない場合、アプローチはおそらく、データがかなり静的であるという高い確信がある場合にのみ有効です。

    次の例を考えてみましょう:

    私のテーブルTには、「今日」の日付タイムスタンプが100行あり、それぞれID =1から100であり、最初のページの最後の20行が必要です。だから私はこれをします:

    select * 
    from T 
    where date_col = trunc(sysdate) 
    order by id desc
    fetch first 20 rows only
    

    クエリを実行して、ID =100を80まで取得します。これまでのところ、すべてがユーザーのページにあり、データの読み取りに30秒かかります。その間に、さらに17レコードがテーブルに追加されました(ID =101〜117)。

    ここで、ユーザーは「次のページ」を押します

    次にクエリを再度実行して、次のセットを取得します

    select * 
    from T 
    where date_col = trunc(sysdate) 
    order by id desc
    offset 20 fetch next 20 rows only
    

    データが変更されているため、80行目から60行目までは表示されません。これは予想どおりです。彼らは

    a)行ID =117から97までを取得し、OFFSETのためにそれらをスキップしますb)次に、行ID=97から77までを取得して画面に表示します

    最初のページとほぼ同じ行のセットが表示されているため、混乱する可能性があります。

    データの変更に対するページネーションについては、通常、offset句を避け、アプリケーションを使用して、どこに到達したかをメモします。つまり、

    ページ1

    select * 
    from T 
    where date_col = trunc(sysdate) 
    order by id desc
    fetch first 20 rows only
    

    ID=100を80までフェッチします...メモを取ります 次のクエリは

    になります。
    select * 
    from T 
    where date_col = trunc(sysdate) 
    AND ID<80
    order by id desc
    fetch first 20 rows only
    

    次のクエリは

    select * 
    from T 
    where date_col = trunc(sysdate) 
    AND ID<60
    order by id desc
    fetch first 20 rows only
    

    など。



    1. Oracle SQLの「@」記号の意味は何ですか?

    2. Oracleクラスタでは、sysdateは常に一貫した回答を返しますか?

    3. Wordpressユーザーとusermeta-1つのテーブルの複数の行を別のテーブルの1つの行に結合する

    4. SQLiteユニオン