可以說有一個n行的表。Oracle SQL查詢使用動態大小檢索每頁數據?
我想設置可變因素:
numberOfPages = 10(頁面大小必須是動態的)
pageToGet = 2;
是否可以在不指定頁面大小和表中總行數的情況下檢索所需的頁面?
可以說有一個n行的表。Oracle SQL查詢使用動態大小檢索每頁數據?
我想設置可變因素:
numberOfPages = 10(頁面大小必須是動態的)
pageToGet = 2;
是否可以在不指定頁面大小和表中總行數的情況下檢索所需的頁面?
嘗試NTILE()
:文章
WITH paginated AS (
SELECT
columns,
NTILE(numberOfPages) OVER (ORDER BY what?) AS pageNum
FROM table
)
SELECT
columns
FROM paginated
WHERE pageNum = pageToGet
大量那裏爲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建議是一個很好的答案,如果你絕對不能指定頁面大小,但我相信你會看到大表上的確定的性能命中(我相信沒有停機鍵優化)。這主要是爲什麼我發佈這個,所以你可以比較性能,看看動態頁面大小是否適合你的應用程序。
申請訂單是強制性的嗎?桌子很大,所以我不想應用排序。 – omrid 2012-02-22 09:22:49
@omrid:是的,對於'NTILE','ORDER BY'子句是強制性的。在SQL Server中,我必須做類似'... ORDER BY(SELECT 1)...'的操作來指定一個'任意'順序,但是Oracle可能只接受一個常量,比如'ORDER BY 1.23'或'ORDER BY'abc''。我不確定,對不起。 – 2012-02-22 09:30:33
+1不錯,一段時間內還沒有看到使用過ntile! – tbone 2012-02-22 12:13:58