取得第 1000-1010 筆資料(頁面大小 10,第 100 頁)。
缺點:建立/銷毀臨時表開銷大,且需傳輸 1010 筆資料至應用層。
缺點:同樣傳輸 1010 筆資料,網路頻寬浪費。
每次僅從資料庫取回頁面大小的資料塊。雖每頁需查詢,但傳輸量極小,搭配連線池省去建連開銷,資料庫端有成熟優化技術(索引、統計資料、執行計畫快取)。
SELECT TOP 10 * FROM (
SELECT TOP 10 * FROM (
SELECT TOP 1010 * FROM docdetail
ORDER BY lastmoddate ASC, Id ASC
) AS temptbl1
ORDER BY lastmoddate DESC, Id DESC
) AS temptbl2
ORDER BY lastmoddate ASC, Id ASC;
邏輯:最內層取前 1010 筆 (ASC) → 中層反向取前 10 筆 (DESC) → 外層再反向回正序 (ASC)。
Oracle ROWNUM 在查詢後、排序前賦值,故需子查詢先排序再過濾:
SELECT * FROM (
SELECT my_table.*, ROWNUM AS rn FROM (
SELECT * FROM my_table ORDER BY sort_col
) my_table
WHERE ROWNUM <= 1010
) WHERE rn >= 1000;
-- SQL Server 2012+ OFFSET/FETCH
SELECT * FROM docdetail
ORDER BY lastmoddate, Id
OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY;
-- Oracle 12c+ OFFSET/FETCH
SELECT * FROM my_table
ORDER BY sort_col
OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY;
COUNT(*) 取得總筆數,考慮快取總數或估算值。