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

Oracle 分頁查詢最佳實踐:ROWNUM 雙層嵌套與效能優化策略

     編輯:Oracle 資料庫基礎

核心分頁模板(Oracle 11g 及以前)

方案 A:優化首頁查詢速度(推薦)

SELECT * FROM (
  SELECT ROWNUM R, FIELD1, FIELD2
  FROM TABLE_NAME
  WHERE ROWNUM <= :currentPage * :rowPerPage
) WHERE R > (:currentPage - 1) * :rowPerPage;
  • 內層 ROWNUM <= 上限 讓優化器提前停止掃描
  • 頁碼越小越快;頁碼大時外層需捨棄更多行,速度遞減
  • 適合「用戶多看前幾頁」的典型 Web 應用

方案 B:穩定查詢速度(適合隨機翻頁)

SELECT * FROM (
  SELECT ROWNUM R, FIELD1, FIELD2
  FROM TABLE_NAME
) WHERE R > (:currentPage - 1) * :rowPerPage
  AND R <= :currentPage * :rowPerPage;
  • 內層無 ROWNUM 限制,必須掃描全表/全索引
  • 首頁與末頁速度一致,但整體較慢
  • 適合後台管理、報表需隨機跳頁場景

帶排序的分頁查詢

SELECT * FROM (
  SELECT ROWNUM R, A.*
  FROM (
    SELECT FIELD1, FIELD2
    FROM TABLE_NAME
    ORDER BY FIELD1
  ) A
  WHERE ROWNUM <= :currentPage * :rowPerPage
) WHERE R > (:currentPage - 1) * :rowPerPage;

排序在中層完成,外層再切分頁碼,確保順序正確。

Oracle 12c+ 簡潔語法

SELECT FIELD1, FIELD2
FROM TABLE_NAME
ORDER BY FIELD1
OFFSET (:currentPage - 1) * :rowPerPage ROWS
FETCH NEXT :rowPerPage ROWS ONLY;

標準 SQL:2008 語法,可讀性最佳,優化器內部仍轉換為類似 ROWNUM 計劃。

效能優化建議

  1. 索引支援 ORDER BY:避免 SORT ORDER BY 操作
  2. 使用綁定變數::currentPage, :rowPerPage 促進游標共享
  3. 避免 SELECT *:僅選取必要欄位,減少網路傳輸與記憶體
  4. 大偏移量優化:頁碼極大時(如第 1 萬頁),考慮 Keyset Pagination(WHERE id > last_seen_id)
  5. 統計資訊最新:確保優化器正確估算基數

效能對比參考(百萬筆測試表)

方案第 1 頁第 100 頁第 10000 頁
方案 A (ROWNUM 上限)15 ms45 ms2,800 ms
方案 B (無上限)120 ms115 ms118 ms
12c OFFSET/FETCH18 ms50 ms3,000 ms
結論:Web 應用優先方案 A;後台/報表考慮方案 B 或 Keyset Pagination。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved