2012-02-22 76 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 2012-02-22 09:22:49

+0

@omrid:是的,對於'NTILE','ORDER BY'子句是強制性的。在SQL Server中,我必須做類似'... ORDER BY(SELECT 1)...'的操作來指定一個'任意'順序,但是Oracle可能只接受一個常量,比如'ORDER BY 1.23'或'ORDER BY'abc''。我不確定,對不起。 – 2012-02-22 09:30:33

+0

+1不錯,一段時間內還沒有看到使用過ntile! – tbone 2012-02-22 12:13:58

0

大量那裏爲Oracle分頁查詢,但我通常使用:

select * from (
    select a.*, rownum r 
    from (
    select * 
    from your_table 
    where ... 
    order by ... 
) a 
    where rownum <= :upperBound 
) 
where r >= :lowerBound; 

整理是必要的,但我通常使用索引列,而使用rownum意味着Oracle可以使用stopkey優化。所以,不一定要做全表掃描。

所以,如果你每頁有100行,並且你想要第3頁,你的lowerBound = 301和upperBound = 400。

使用NTILE作爲AndriyM建議是一個很好的答案,如果你絕對不能指定頁面大小,但我相信你會看到大表上的確定的性能命中(我相信沒有停機鍵優化)。這主要是爲什麼我發佈這個,所以你可以比較性能,看看動態頁面大小是否適合你的應用程序。