欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dump 索引的根节点

程序员文章站 2022-05-24 18:23:58
...
我们可以使用如下方式将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的索引块所链接的最小键值。

 

相关标签: Oracle dump解析