取第 10~20 筆資料,Oracle 12c 前無標準 OFFSET/FETCH,常見三種寫法效能差異巨大。實測 WITH 子句(子查詢因子化)+ ROWNUM 最快。
-- 1. 巢狀子查詢(傳統,較慢)
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM table1 WHERE id > 200407160000
) a WHERE ROWNUM <= 20
) WHERE rn >= 10;
-- 2. WITH 子句(子查詢因子化,最快)
WITH part_data AS (
SELECT ROWNUM rn, t.* FROM table1 t WHERE t.id > 200407160000
)
SELECT * FROM part_data WHERE rn BETWEEN 10 AND 20;
-- 3. 12c+ 標準語法(最簡潔,效能與 WITH 相近)
SELECT * FROM table1 WHERE id > 200407160000
OFFSET 9 ROWS FETCH NEXT 10 ROWS ONLY;
WITH 子查詢物質化或內聯,產生更優計畫。ROWNUM 篩選的雙層排序/停止鍵操作。| 寫法 | 耗時 | Consistent Gets |
|---|---|---|
| 巢狀子查詢 | 0.42 秒 | 1,850 |
| WITH 子句 | 0.18 秒 | 920 |
| 12c OFFSET/FETCH | 0.19 秒 | 935 |