在處理大量數據查詢時,分頁顯示是提升用戶體驗與系統性能的關鍵技術。以員工表為例,需按薪資排序後每頁顯示 5 筆資料,若要獲取第 2 頁(第 6 至 10 筆)數據,常見有兩種實現方式。
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;
此方式需嵌套兩層子查詢:內層排序並過濾空值,中層限制最大行數,外層過濾起始行號。雖然兼容性好,但結構較繁瑣,隨分頁深度增加性能下降明顯。
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 雙層嵌套)作為標準模板。雖代碼稍長,但執行計劃穩定,不受分析函數干擾,能充分利用索引與優化器特性,確保大數據量下的分頁查詢性能穩定。