如何找到某個鍵值在索引中存在於哪個BLOCK中
首先得到索引的OBJECT_ID,然後DUMP出這個索引的根資訊:
SQL> select DATA_OBJECT_ID,OBJECT_ID from dba_objects where object_name='IDX_MEMBERIDENTITY_IDCONTENT';
DATA_OBJECT_ID OBJECT_ID
-------------- ----------
130792 130792
然後DUMP這個索引樹
SQL> alter session set events 'immediate trace name treedump level 130792';
Session altered
然後找到DUMP出來的TRACE檔案,內容大致如下:
----- begin tree dump
branch: 0x8465e8d 138829453 (0: nrow: 240, level: 2)
branch: 0x8466296 138830486 (-1: nrow: 353, level: 1)
leaf: 0x8465e8e 138829454 (-1: nrow: 224 rrow: 223)
leaf: 0x8465e8f 138829455 (0: nrow: 195 rrow: 195)
leaf: 0x8465e90 138829456 (1: nrow: 197 rrow: 197)
說明這個索引是兩層的,後面的NROW和RROW分別表示這個塊可以存放多少行資料以及目前存放了多少行資料,從上面可以看到索引的根節點的地址是138829453,那麼可以透過下面的方式得到這個根節點存在於哪個BLOCK中:
SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(138829453) "file",
2 DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(138829453) "block"
3 FROM DUAL;
file block
---------- ----------
33 417421
然後把33號檔案的417421號BLOCK DUMP出來,就可以看到根節點中的內容:
SQL> alter system dump datafile 33 block 417421;
System altered
然後把EMAIL:轉換成16進位制,去根TRACE檔案中的值進行對比,就可以發現EMAIL值是存在於哪個葉節點下面的,首先轉換EMAIL到16進位制:
SQL> select utl_raw.cast_to_raw() from dual;
UTL_RAW.CAST_TO_RAW('ZHANG4108
--------------------------------------------------------------------------------
7A68616E673431303832403136332E636F6D
因為索引中存的16進位制都是小寫的,而且每個字元中間是有空格的,所以格式化後的EMAIL的16進製為:
7a 68 61 6e 67 34 31 30 38 32 40 31 36 33 2e 63 6f 6d
根據這個字串到剛才DUMP出來的根節點去對比,可以找到下面一段:
row#227[6288] dba: 139652795=0x852eebb
col 0; len 4; (4): 79 7a 67 30
col 1; TERM
row#228[6493] dba: 138917985=0x847b861
col 0; len 9; (9): 7a 65 6e 67 79 61 6e 67 61
col 1; TERM
row#229[5114] dba: 140549035=0x8609bab
col 0; len 8; (8): 7a 68 61 6e 67 67 68 32
可以看到EMAIL轉換後的16進位制是在上面這兩個值中間的,那說明EMAIL是存放在139652795葉節點下面的,那下面就來找到這個葉節點並把它DUMP出來:
SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(138917985) "file",
2 DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(138917985) "block"
3 FROM DUAL;
file block
---------- ----------
33 505953
SQL> alter system dump datafile 33 block 505953;
System altered
在葉節點DUMP出來的TRACE檔案中可以找到下面的地方:
row#291[6494] dba: 138917683=0x847b733
col 0; len 9; (9): 7a 68 61 6e 67 34 31 30 33
col 1; TERM
row#292[6509] dba: 138917684=0x847b734
col 0; len 16; (16): 7a 68 61 6e 67 34 34 31 36 35 35 36 32 34 36 40
這說明最後的EMAIL是在索引中的位置是存放在138917683對應的BLOCK中的,接下來把這個BLOCK DUMP出來:
SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(138917683) "file",
2 DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(138917683) "block"
3 FROM DUAL;
file block
---------- ----------
33 505651
SQL> alter system dump datafile 33 block 505651;
System altered
最後可以在DUMP出來的BLOCK中找到下面內容:
row#5[1104] flag: ------, lock: 0, len=32
col 0; len 18; (18): 7a 68 61 6e 67 34 31 30 38 32 40 31 36 33 2e 63 6f 6d
col 1; len 10; (10): 00 01 f6 3b 09 87 52 5b 00 28
這個地方就是EMAIL在這個索引中真正存在的內容,其中COL0表示的是EMAIL的16進位制,然後COL1表示的是這個EMAIL對應的ROWID,至於這個ROWID怎麼還原成真正的ROWID,那下次在來完成吧。
另外,這裡只是一個簡單的索引,那麼如果是分割槽索引、壓縮索引或者複合索引、函式索引等等,情況可能會略有差別
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-1020075/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL2008查詢某資料庫中的某個值是否存在SQL資料庫
- python列表中是否存在某個元素Python
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- 如何找到某個 ABAP structure 某欄位的源頭來自哪個資料庫表Struct資料庫
- 關於如何能夠快速找到某個文字在所有檔案中的出現位置
- Python中怎麼讀取列表中某個值?Python
- vue 中 watch如何監聽陣列或物件中的某個值?Vue陣列物件
- 寫個方法判斷陣列物件中是否存在某個物件陣列物件
- 給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。排序陣列索引
- sqlserver判斷欄位值是否存在某個字元SQLServer字元
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- 獲取母字串中某個子字串的某個確定的index值字串Index
- mysql如何判斷是否存在某個欄位MySql
- 使用PL/SQL找到兩個表中的相似值FKSQL
- 如何使用Chrome找到Marketing Cloud某個contact的guidChromeCloudGUI
- 如何查詢某個資料表中除某個欄位的所有資訊???
- PHP 如何根據鍵值刪除一個陣列中的元素PHP陣列
- 在Linux中,如何備份某個使用者的任務計劃?Linux
- Flutter中如何強制某個頁面橫屏Flutter
- JsonRequestBehavior不存在問題,JsonRequestBehavior屬於哪個dllJSON
- LINUX中如何檢視某個埠是否被佔用Linux
- 多個陣列,判斷鍵值是否存在從屬關係陣列
- 面試題解:輸入一個數A,找到大於A的一個最小數B,且B中不存在連續相等的兩個數字面試題
- 在js中獲取 input checkbox裡選中的多個值JS
- mysql中數值型資料有哪兩個類別?MySql
- 在Linux中,如何使用shell指令碼判斷某個服務是否正在執行?Linux指令碼
- 在Linux中, 如何建立一個快照?Linux
- RPM索引在Artifactory中是如何工作索引
- [轉載] Java中如何在方法中return返回多個值Java
- 找到兩個陣列中的公共元素陣列
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- OpenGL 紋理取樣 在GPU中哪個部件完成GPU
- 在 .NET 中的 ConvertAll 和 Select 方法哪個效能好
- 515. 在每個樹行中找最大值
- inline、block、inline-block這三個屬性值有什麼區別?inlineBloC
- pycharm中幾個快捷鍵PyCharm
- 如何找到 SAP Spartacus 裡某個 Component TypeScript 編譯後生成的 JavaScript 位置TypeScript編譯JavaScript
- 在Linux中,如何建立一個分割槽?Linux