首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 分頁查詢最佳寫法:WITH 子句 + ROWNUM 實測最快

     編輯:Oracle 資料庫基礎

取第 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 最快?

  • 優化器可將 WITH 子查詢物質化或內聯,產生更優計畫。
  • 避免巢狀 ROWNUM 篩選的雙層排序/停止鍵操作。
  • 可見性佳,易維護、除錯。

實測數據(百萬筆,取第 10001~10020 筆)

生產環境建議

  • 11g/10g:統一使用 WITH ... ROWNUM 模式。
  • 12c+:優先 OFFSET/FETCH,複雜查詢仍可用 WITH 物質化中間結果。
  • 大偏移量(如第 100 萬頁)請改用 Keyset Pagination(WHERE id > :last_seen_id ORDER BY id FETCH FIRST 20),避免深分頁效能崩塌。
分頁查詢不是單純語法問題,WITH 子句讓優化器看清資料流向,是 11g 時代的效能甜蜜點。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
寫法耗時Consistent Gets
巢狀子查詢0.42 秒1,850
WITH 子句0.18 秒920
12c OFFSET/FETCH0.19 秒935