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

SQL 結果集分頁優化:ROWNUM 與 ROW_NUMBER() 實戰對比

     編輯:MySQL 綜合教學

SQL 結果集分頁優化:ROWNUM 與 ROW_NUMBER() 實戰對比

在處理大量數據查詢時,分頁顯示是提升用戶體驗與系統性能的關鍵技術。以員工表為例,需按薪資排序後每頁顯示 5 筆資料,若要獲取第 2 頁(第 6 至 10 筆)數據,常見有兩種實現方式。

方案一:傳統 ROWNUM 雙層嵌套查詢

SELECT rn, ename, sal
FROM (
    SELECT ROWNUM AS rn, ename, sal
    FROM (
        SELECT ename, sal FROM emp WHERE sal IS NOT NULL ORDER BY sal
    )
    WHERE ROWNUM <= 10
)
WHERE rn >= 6;

此方式需嵌套兩層子查詢:內層排序並過濾空值,中層限制最大行數,外層過濾起始行號。雖然兼容性好,但結構較繁瑣,隨分頁深度增加性能下降明顯。

方案二:分析函數 ROW_NUMBER() 單層嵌套

SELECT rn, ename, sal
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY sal) AS rn, ename, sal
    FROM emp
    WHERE sal IS NOT NULL
)
WHERE rn BETWEEN 6 AND 10;

使用 ROW_NUMBER() 窗口函數生成序號後直接過濾,僅需單層嵌套,語句更簡潔、可讀性更強。但需注意:分頁語句的特殊性可能導致執行計劃受分析函數影響,部分索引或 FIRST_ROWS 優化策略可能失效。

最佳實踐建議

綜合性能與穩定性考量,生產環境建議採用方案一(ROWNUN 雙層嵌套)作為標準模板。雖代碼稍長,但執行計劃穩定,不受分析函數干擾,能充分利用索引與優化器特性,確保大數據量下的分頁查詢性能穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved