缺點:建立/銷毀臨時表開銷大,網路傳輸資料量 = (頁碼×頁大小)。
在應用端 (ADO Recordset/Collection) 反向取資料,同樣需先撈取前 N+頁大小 筆。
每次僅從資料庫撈取「單頁資料量」,利用資料庫索引與優化器,網路流量極小。
-- 取第 1001-1010 筆 (第 101 頁, 頁大小 10)
SELECT TOP 10 * FROM (
SELECT TOP 10 * FROM (
SELECT TOP 1010 * FROM docdetail
ORDER BY lastmodidate ASC, Id ASC
) t1 ORDER BY lastmodidate DESC, Id DESC
) t2 ORDER BY lastmodidate ASC, Id ASC
原理:內層取前 1010 筆 → 中層倒序取後 10 筆 → 外層恢復正序。
SELECT * FROM (
SELECT t.*, ROWNUM AS rn FROM (
SELECT * FROM docdetail ORDER BY lastmodidate ASC, Id ASC
) t WHERE ROWNUM < 1010
) WHERE rn >= 1000
關鍵:Oracle ROWNUM 在排序前賦值,故需子查詢先排序再過濾。
某客戶 Oracle 12 萬筆文檔:
OFFSET ... FETCH NEXT。OFFSET ... ROWS FETCH NEXT ... ROWS ONLY。