一、ROWNUM:結果集順序偽列
- 特性:查詢產生結果集時動態生成,從 1 開始遞增;
- 不存在於表中,不可更新、不可索引;
- 關鍵規則:只有 ROWNUM=1 存在時,才可能有 ROWNUM=2。
WHERE 條件陷阱
| 條件 | 結果 | 原因 |
| ROWNUM = 1 | 首行 | 首行滿足,返回 |
| ROWNUM < 10 | 前 9 行 | 逐行遞增,滿足直到第 9 行 |
| ROWNUM = 5 | 空集 | 首行 ROWNUM=1 不滿足,直接過濾掉,後續行永無機會 |
| ROWNUM > 5 | 空集 | 同理,首行即被過濾 |
二、正確分頁查詢模式
模式 1:子查詢物化 ROWNUM(推薦)
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT * FROM large_table WHERE col > 100 ORDER BY id
) t WHERE ROWNUM <= 20
) WHERE rn >= 11;
- 內層
ROWNUM <= 20 利用「Count Stopkey」優化,僅取前 20 行停止掃描;
- 外層過濾
rn >= 11 獲取第 11-20 行。
模式 2:MINUS 集合運算(資源消耗大,不推薦)
SELECT * FROM table WHERE cond AND ROWNUM < 20
MINUS
SELECT * FROM table WHERE cond AND ROWNUM < 10;
三、ROWID:物理地址偽列
- 特性:行級唯一、相對固定(除非表移動/導入導出/分區移動);
- 18 字符編碼(文件號、塊號、槽號);
- 單行訪問最快路徑:
SELECT * FROM table WHERE ROWID = 'AAAP...'。
四、ROWID 變更場景
ALTER TABLE ... MOVE;
EXP/IMP 或 Data Pump 導入導出;
- 分區維護(
MOVE PARTITION、SPLIT PARTITION);
- Flashback Table / Shrink Space。
五、實戰建議
- 分頁必須用子查詢物化 ROWNUM,禁止直接
WHERE ROWNUM BETWEEN ...;
- 大表分頁配合
ORDER BY + 索引,避免全表排序;
- ROWID 僅用於單行精確定位(如應用層緩存 ROWID 後續直接訪問),不作為業務主鍵;
- 12c+ 可用
OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 標準語法替代 ROWNUM 分頁。
- 上一篇文章: 從 Alert.log 深度解析 Oracle 9i 啟動全過程:NOMOUNT → MOUNT → OPEN
- 下一篇文章: Oracle 監聽器安全配置全攻略:口令設置、遠程關閉風險、Net Manager 圖形化部署
Copyright ©
程式碼之家 All Rights Reserved