首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle ROWNUM 與 ROWID 深度解析:偽列特性、分頁查詢陷阱與高效模式

     編輯:Oracle 資料庫相關知識

一、ROWNUM:結果集順序偽列

  • 特性:查詢產生結果集時動態生成,從 1 開始遞增;
  • 不存在於表中,不可更新、不可索引;
  • 關鍵規則:只有 ROWNUM=1 存在時,才可能有 ROWNUM=2。

WHERE 條件陷阱

二、正確分頁查詢模式

模式 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 變更場景

  1. ALTER TABLE ... MOVE;
  2. EXP/IMP 或 Data Pump 導入導出;
  3. 分區維護(MOVE PARTITION、SPLIT PARTITION);
  4. Flashback Table / Shrink Space。

五、實戰建議

  1. 分頁必須用子查詢物化 ROWNUM,禁止直接 WHERE ROWNUM BETWEEN ...;
  2. 大表分頁配合 ORDER BY + 索引,避免全表排序;
  3. ROWID 僅用於單行精確定位(如應用層緩存 ROWID 後續直接訪問),不作為業務主鍵;
  4. 12c+ 可用 OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 標準語法替代 ROWNUM 分頁。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
條件結果原因
ROWNUM = 1首行首行滿足,返回
ROWNUM < 10前 9 行逐行遞增,滿足直到第 9 行
ROWNUM = 5空集首行 ROWNUM=1 不滿足,直接過濾掉,後續行永無機會
ROWNUM > 5空集同理,首行即被過濾