dump 索引的根節點

我們可以使用如下方式將B樹索引轉儲成樹狀結構的形式而呈現出來:

alter session set events 'immediate trace name treedump level INDEX_OBJECT_ID';

比如,對於上面的例子來說,我們把創建在object上的名爲IDX_WARECOUNTD_GOODID的索引轉儲出來。

SQL> select object_id from user_objects where object_name='IDX_WARECOUNTD_GOODID';

 OBJECT_ID
----------
     88993
	 
> alter session set events 'immediate trace name treedump level 88993';


SQL>select value from v$diag_info where name='Default Trace File';

----- begin tree dump
branch: 0x103161b 16979483 (0: nrow: 8, level: 2)
   branch: 0x10324a9 16983209 (-1: nrow: 412, level: 1)
      leaf: 0x1031b10 16980752 (-1: nrow: 397 rrow: 397)
      leaf: 0x1034761 16992097 (0: nrow: 403 rrow: 403)
	  
    其中,每一行的第一列表示節點類型:branch表示分支節點(包括根節點),而leaf則表示葉子節點;第二列表示十六進制表示的節點的地址;第三列表示十進制表示的節點的地址;第四列表示相對於前一個節點的位置,根節點從0開始計算,其他分支節點和葉子節點從-1開始計算;第五列的nrow表示當前節點中所含有的索引條目的數量。比如我們可以看到根節點中含有的nrow爲9,表示根節點中含有9個索引條目,分別指向9個分支節點;第六列中的level表示分支節點的層級,對於葉子節點來說level都是0。第六列中的rrow表示有效的索引條目(因爲索引條目如果被刪除,不會立即被清除出索引塊中。所以nrow減rrow的數量就表示已經被刪除的索引條目數量)的數量,比如對於第一個leaf來說,其rrow爲359,也就是說該葉子節點中存放了359個可用索引條目,分別指向表warecountd的359條記錄。
	
	   上面這種方式以樹狀形式轉儲整個索引。同時,我們可以轉儲一個索引節點來看看其中存放了些什麼。轉儲的方式爲:

alter system dump datafile file# block block#;

      我們從上面轉儲結果中的第二行知道,索引的根節點的地址爲25225994,因此我們先將其轉換爲文件號以及數據塊號。


dump 根節點:
select dbms_utility.data_block_address_file(16979483),

  dbms_utility.data_block_address_block(16979483) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRES DBMS_UTILITY.DATA_BLOCK_ADDRES


SQL> select dbms_utility.data_block_address_file(16979483),   
       dbms_utility.data_block_address_block(16979483)
  from dual;
  2    3  
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16979483) DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16979483)
---------------------------------------------- -----------------------------------------------
					     4						202267
						 
						 
      於是,我們轉儲根節點的內容。

SQL> alter system dump datafile 4 block 202267;

      打開轉儲出來的跟蹤文件,我們可以看到如下的索引頭部的內容:


打開轉儲出來的跟蹤文件,我們可以看到如下的索引頭部的內容:

branch: 0x103161b 16979483 (0: nrow: 8, level: 2)

kdxconco表示索引條目中列的數量

kdxconro表示當前索引節點中索引條目的數量

	
=================
header address 140329769740876=0x7fa11213aa4c
kdxcolev 2
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 1
kdxconro 7
kdxcofbo 42=0x2a
kdxcofeo 7989=0x1f35
kdxcoavs 7947
kdxbrlmc 16983209=0x10324a9
kdxbrsno 4
kdxbrbksz 8056
kdxbr2urrc 0
row#0[8009] dba: 16994288=0x1034ff0

其中的kdxcolev表示索引層級號,這裏由於我們轉儲的是根節點,所以其層級號爲2。

branch: 0x103161b 16979483 (0: nrow: 8, level: 2)	
	  
row#0[8009] dba: 16994288=0x1034ff0
col 0; len 4; (4):  c3 06 2f 36
col 1; TERM
row#1[8029] dba: 16990264=0x1034038
col 0; len 3; (3):  c3 06 5a
col 1; TERM
row#2[7999] dba: 16994256=0x1034fd0
col 0; len 4; (4):  c3 07 23 21
col 1; TERM
row#3[8047] dba: 16983213=0x10324ad
col 0; len 3; (3):  c3 07 4f
col 1; TERM
row#4[7989] dba: 16995386=0x103543a
col 0; len 4; (4):  c3 08 1d 0c
col 1; TERM
row#5[8038] dba: 16987041=0x10333a1
col 0; len 3; (3):  c3 08 4f
col 1; TERM
row#6[8019] dba: 16992010=0x103470a
col 0; len 4; (4):  c3 09 1f 46
col 1; TERM
----- end of branch block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 202267 maxblk 202267

	  
比如對於row #0來說,col 0爲31 30 30 30 30 30 30 33,則將其中每對值都使用函數to_number(NN,’XX’)的方式從十六進制轉換爲十進制

col 0; len 4; (4):  c3 06 2f 36

如果根節點下沒有其他的分支節點,則col 1爲TERM


數值類型轉換:

declare       n number;     begin       dbms_stats.convert_raw_value('c102',                                    n);       dbms_output.put_line(n);     end; 





195,6,47,54

 假設我們有一個非分區表,表名爲warecountd,其數據行數爲130萬行。該表中有一個列,列名爲goodid,其類型爲char(8),那麼也就是說該goodid的長度爲固定值:8。同時在該列上創建了一個B樹索引。
 
 declare
  n number;
begin
  dbms_stats.convert_raw_value('c3062f36', n);
  dbms_output.put_line(n);
end;

branch: 0x103161b 16979483 (0: nrow: 8, level: 2)	


row#0[8009] dba: 16994288=0x1034ff0
col 0; len 4; (4):  c3 06 2f 36  --54653
col 1; TERM
row#1[8029] dba: 16990264=0x1034038
col 0; len 3; (3):  c3 06 5a     --58900
col 1; TERM
row#2[7999] dba: 16994256=0x1034fd0
col 0; len 4; (4):  c3 07 23 21   --63432
col 1; TERM
row#3[8047] dba: 16983213=0x10324ad
col 0; len 3; (3):  c3 07 4f     --67800
col 1; TERM
row#4[7989] dba: 16995386=0x103543a
col 0; len 4; (4):  c3 08 1d 0c   --72811
col 1; TERM
row#5[8038] dba: 16987041=0x10333a1 
col 0; len 3; (3):  c3 08 4f      --77800
col 1; TERM
row#6[8019] dba: 16992010=0x103470a
col 0; len 4; (4):  c3 09 1f 46   --83069
col 1; TERM
 
 
SQL> select dump('54653') from dual;

DUMP('54653')
----------------------------
Typ=96 Len=5: 53,52,54,53,51


54653就是dba爲16994288的索引塊所鏈接的最小鍵值。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章