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

Oracle 8 ROWID 結構深度解析與應用遷移指南

     編輯:Oracle 資料庫基礎

ROWID 為何改版?

Oracle 7 ROWID 僅含 FILE、BLOCK、ROW NUMBER,檔案號為絕對值。Oracle 8 引入表空間相對檔案號(Relative File Number),同一相對號可屬不同表空間,故須在 ROWID 中加入 Data Object Number(段標識)以唯一定位。

擴展 ROWID 結構(18 字元 Base64)

位置長度含義
1-66Data Object Number(段/分區標識)
7-93Relative File Number(表空間相對檔案號)
10-156Block Number(檔案內區塊號)
16-183Slot Number(區塊內行槽位)

內部儲存 10 位元組:(Data Object Number, Block Number, Row Number)。

表空間相對定址

  • 多個檔案可有相同相對號(屬不同表空間),但處理特定物件時已知其表空間,故相對號在表空間內唯一。
  • 支援超大資料庫關鍵技術。

Data Object Number 與 Object ID 差異

  • 初始 OBJECT_ID = DATA_OBJECT_ID。
  • 執行 TRUNCATE TABLE、MOVE PARTITION 後 DATA_OBJECT_ID 遞增。
  • Oracle 讀取時比對 ROWID 中的 Data Object Number 與區塊頭的一致性,保證版本正確;Rollback 記錄同理。
  • Data Object Number 非 Object 標識,勿混淆。

受限 ROWID(舊格式)

  • 內部 6 位元組:4B Block Number + 2B Row Number。
  • 用於:非分區表索引項、分區表本地索引項、Row Piece Chain 指標。
  • 不可用於分區表全域索引(跨表空間)。
  • 顯示仍為 18 字元(左補零)。

擴展 ROWID 使用場景

  • 分區表全域索引。
  • Server 內部演算法。
  • SELECT 顯示、儲存於 ROWID 欄位。

跨版本遷移與應用影響

場景行為
Oracle 8 查 Oracle 7 ROWID回傳 Oracle 7 格式,可用於 WHERE 條件
Oracle 7 查 Oracle 8 ROWID回傳 Oracle 8 格式,可用於 WHERE,但不可存入 ROWID 欄位;需用 DBMS_ROWID 解析
含擴展 ROWID 的資料 IMP 到 Oracle 7失敗
Oracle 7 資料 IMP 到 Oracle 8自動擴展

應用遷移檢查清單

僅當應用自行組合/分解 ROWID 或 表含 ROWID 欄位 時需修改,改用 DBMS_ROWID 套件。單純傳遞/整體使用無影響。

DBMS_ROWID 核心函數

  • ROWID_CREATE、ROWID_INFO、ROWID_TYPE、ROWID_OBJECT
  • ROWID_RELATIVE_FNO、ROWID_BLOCK_NUMBER、ROWID_TO_ABSOLUTE_FNO
  • ROWID_TO_EXTENDED:受限→擴展(舊→新)
  • ROWID_TO_RESTRICTED:擴展→受限
  • ROWID_VERIFY:檢查受限是否可轉擴展

建立腳本:$ORACLE_HOME/rdbms/admin/dbmsutil.sql(含於 catproc.sql)。

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