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

Oracle 邏輯 ROWID 儲存格式深度解析:索引組織表 (IOT) 實測驗證

     編輯:Oracle 資料庫基礎

背景:邏輯 ROWID vs 物理 ROWID

  • 物理 ROWID:Heap 表,編碼 Data Object ID + Relative File# + Block# + Row#,固定 10 位元組(Extended 格式)。
  • 邏輯 ROWID:IOT / Partitioned 表,**包含主鍵值**,長度可變,官方文件未公開編碼規則。

實驗環境


CREATE TABLE test_index (id NUMBER PRIMARY KEY, name VARCHAR2(20)) ORGANIZATION INDEX;
INSERT INTO test_index VALUES (1, 'a');
COMMIT;

DUMP 解碼實測


SELECT rowid, DUMP(rowid) dump_rowid FROM test_index;
結果:
ROWID: *BAFAB4wCwQL+
DUMP: Typ=208 Len=10: 2,4,1,64,7,140,2,193,2,254

位元組語意解析

位置值含義
12**起始標記**(固定)
24**版本/類型標記**(固定)
31相對檔案號 × 64 高位(此處 1×64=64)
464相對檔案號 × 64 低位 → 檔案號 = (1×256+64)/64 = 5
57區塊號高位
6140區塊號低位 → Block = 7×256+140 = 1932
72**主鍵欄位 1 長度**(2 位元組)
8193主鍵值位元組 1 (NUMBER 內部編碼:193,2 = 值 1)
92主鍵值位元組 2
10254**結束標記**(固定)

驗證:DUMP 定位至實體區塊


ALTER SYSTEM DUMP DATAFILE 5 BLOCK 1932;
Trace 檔中 Leaf Block 顯示:
row#0[8026] flag: K----, lock: 2
col 0; len 2; (2): c1 02   -- NUMBER 內部碼對應值 1
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col 0: [1]                  -- name 欄值 'a'
**完美對應**:邏輯 ROWID 第 3-6 位元組確實指向該區塊。

關鍵機制:Physical Guess

IOT 中資料依主鍵順序儲存,**INSERT/UPDATE/DELETE 會導致資料移動**,Physical Guess(檔案/區塊)可能失效。

**存取流程**:

  1. 依 Physical Guess 直接讀取區塊。
  2. 檢查區塊中是否存在目標主鍵。
  3. 若不在 → **拋棄 Guess,改用主鍵走 B*Tree 索引掃描定位**。

這就是文件提到的 physical guess 機制。

複合主鍵實測


CREATE TABLE test_index2 (
  id CHAR(4), dt DATE,
  CONSTRAINT pk_test_index2 PRIMARY KEY (id, dt)
) ORGANIZATION INDEX;
INSERT INTO test_index2 VALUES ('1', SYSDATE);
COMMIT;
DUMP:
Typ=208 Len=20: 2,4,1,64,7,148,
4,49,32,32,32,   -- id='1' + 3 spaces (CHAR(4) 固定長度)
7,120,104,12,23,1,35,19,  -- DATE 7 位元組內部格式
254
  • 第 7 位元組 = 第 1 欄長度 (4) → 後 4 位元組為 CHAR 值。
  • 第 12 位元組 = 第 2 欄長度 (7) → 後 7 位元組為 DATE 內部格式。
  • **各欄長度 + 內部編碼依序排列**,與欄位定義順序一致。

長度編碼擴展:>127 位元組

  • 長度 ≤ 127:單一位元組(0~7F)。
  • 長度 > 127:雙位元組,**首位元組 8x 表示擴展**,次位元組為實際長度高位。
    例:128 → 80 80,3800 → 8E D8。

結語

邏輯 ROWID 結構 = **固定頭 (2,4) + Physical Guess (檔案/區塊) + 主鍵欄位序列 (長度+值...) + 固定尾 (254)**。Physical Guess 提供快速路徑,失效時回退索引掃描,保證正確性。理解此格式有助於分析 IOT 存取路徑、偵錯 ORA-01410 失效 ROWID、優化大主鍵 IOT 設計。

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