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的索引块所链接的最小键值。
上一篇: 创建bean的三种方式
下一篇: windows sdk 子类化
推荐阅读
-
详解Linux系统中inode索引节点已满问题的解决方法
-
彻底解决Linux索引节点(inode)占用率高的告警
-
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
-
以递归方式从指定根节点,获取一个树型结构的数据 javarecursivetreedata structure
-
二叉树和为某一值的路径-路径必须是从根节点出发,还必须非得到达叶节点。
-
Linux的文件描述符、文件指针、索引节点详情
-
ASP 递归调用 已知节点查找根节点的函数
-
使用XStream将xml字符串(文件)反序列化为javaBean去掉最外层(或根节点)的一种方法
-
ztree——如何获取当前节点的根节点
-
dump 索引的根节点