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

Oracle 索引區塊深度解析:TREE DUMP 與 LEAF BLOCK DUMP 實戰手冊

     編輯:Oracle 教學

從 TREE DUMP 到 LEAF BLOCK DUMP:索引內部結構一探究竟

本文示範如何在 Oracle 10g/11g 中導出索引樹結構與葉區塊內容,並解析 Rowid 與索引鍵值編碼。

1. 導出索引樹結構

ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 95503';

95503 為索引 OBJECT_ID (可從 DBA_OBJECTS 查詢)。追蹤檔位於 USER_DUMP_DEST。

2. 解析 TREE DUMP 輸出

branch: 0x100150c 16782604 (0: nrow: 178, level: 1)
leaf: 0x100150d 16782605 (-1: nrow: 288 rrow: 288)
leaf: 0x100150e 16782606 (0: nrow: 289 rrow: 289)
leaf: 0x100150f 16782607 (1: nrow: 288 rrow: 288)
...
  • 0x100150f = 區塊 DBA (十六進位)
  • 16782607 = 區塊 DBA (十進位)
  • nrow = 區塊總記錄數,rrow = 有效記錄數

3. 導出指定葉區塊內容

-- 將十六進位 DBA 轉檔號/區塊號
VAR file# NUMBER; VAR block# NUMBER;
EXEC :file# := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(TO_NUMBER('100150F','XXXXXXXX'));
EXEC :block# := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('100150F','XXXXXXXX'));
PRINT file#;  -- 4
PRINT block#; -- 5391

-- 導出區塊
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 5391;

4. LEAF BLOCK DUMP 關鍵欄位解讀

Leaf block dump
kdxconro 288                -- 記錄數
row#0[8013] flag: ------, lock: 0, len=23
col 0; len 5; (5): 31 30 36 31 31   -- 索引鍵值1 (VARCHAR2) '10611'
col 1; len 7; (7): 78 73 04 08 0f 3c 19  -- 索引鍵值2 (DATE) 2015-04-08 14:59:24
col 2; len 6; (6): 01 00 14 26 01 66  -- Rowid (十六進位)

5. Rowid 十六進位解碼

01 00 14 26 01 66
→ 二進位:00000001 00000000 00010100 00100110 00000001 01100110
→ 檔號 (前 10 bits)  = 4
→ 區塊號 (中 22 bits) = 5158
→ 行號 (後 16 bits)  = 358

6. 索引鍵值十六進位轉原始值

-- VARCHAR2
SELECT UTL_RAW.CAST_TO_VARCHAR2('3130363131') FROM DUAL;  -- '10611'

-- DATE (需自訂函數 f_get_from_dump)
SELECT f_get_from_dump('78,73,04,08,0F,3C,19','DATE') FROM DUAL;  -- 2015-04-08 14:59:24

實務應用場景

  • 索引損壞分析、遺失行調查
  • 研究索引壓縮、前綴壓縮效果
  • 驗證 DELETE 後標記刪除旗標 (kdxlende)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved