2012-02-22 9 views

答えて

2

NTILE()をお試しください:オラクルのページネーションクエリのためにそこに

WITH paginated AS (
    SELECT 
    columns, 
    NTILE(numberOfPages) OVER (ORDER BY what?) AS pageNum 
    FROM table 
) 
SELECT 
    columns 
FROM paginated 
WHERE pageNum = pageToGet 
+0

注文を行うことは必須ですか?テーブルは巨大なので、並べ替えを適用したくありません。 – omrid

+0

@omrid:はい、 'ORDER BY'節は' NTILE'に必須です。 SQL Serverでは、この場合は '... ORDER BY(SELECT 1)... 'のように'任意の '順序を指定する必要がありますが、Oracleでは' ORDER BY 1.23'または 'ORDER BY 'abc''です。私は確信していません、申し訳ありません。 –

+0

+1いいね、しばらく使っていないのを見たことがありません! – tbone

0

記事が充実していますが、私は一般的に使用します。

必要とされていることにより、
select * from (
    select a.*, rownum r 
    from (
    select * 
    from your_table 
    where ... 
    order by ... 
) a 
    where rownum <= :upperBound 
) 
where r >= :lowerBound; 

注文が、私は通常、インデックス付きの列を使用し、 rownumの使用は、Oracleがストップキーの最適化を使用できることを意味します。だから、必ずしもフルテーブルスキャンを行うつもりはありません。

ページあたり100行あり、ページ3が必要な場合、lowerBound = 301およびupperBound = 400です。

NTILEをAndriyMとして使用することは、ページサイズを絶対に指定できない場合には良い答えですが、大規模なテーブルでは明確なパフォーマンスヒットが発生すると思います。主に私がこれを投稿した理由は、パフォーマンスを比較し、動的ページサイズがあなたのアプリにとって理にかなっているかどうかを見ることができるからです。

関連する問題