• 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的索引块所链接的最小键值。
    
    
  • 相关阅读:
    Windows 命令提示符
    力扣 ——Linked List Cycle II(环形链表 II) python实现
    力扣——Linked List Cycle(环形链表) python实现
    力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现
    力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
    剑指offer-链表中倒数第k个结点
    剑指offer-调整数组顺序使奇数位于偶数前面
    剑指offer-数值的整数方
    剑指offer-二进制中1的个数
    剑指offer-矩形覆盖
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348395.html
Copyright © 2020-2023  润新知