浅析oracle b-tree index搜索原理(二)

2014-11-24 12:24:48 · 作者: · 浏览: 1
dump
branch: 0x40efaa 4255658 (0: nrow: 2, level: 2)
branch: 0x40f603 4257283 (-1: nrow: 247, level: 1)
leaf: 0x40efab 4255659 (-1: nrow: 182 rrow: 182)
leaf: 0x40efac 4255660 (0: nrow: 182 rrow: 182)
leaf: 0x40efad 4255661 (1: nrow: 186 rrow: 186)
leaf: 0x40efae 4255662 (2: nrow: 189 rrow: 189)
leaf: 0x40efaf 4255663 (3: nrow: 186 rrow: 186)
leaf: 0x40efb0 4255664 (4: nrow: 190 rrow: 190)
leaf: 0x40efb1 4255665 (5: nrow: 185 rrow: 185)
leaf: 0x40efb2 4255666 (6: nrow: 179 rrow: 179)
leaf: 0x40efb3 4255667 (7: nrow: 187 rrow: 187)
leaf: 0x40efb4 4255668 (8: nrow: 181 rrow: 181)
............................................
............................................
branch: 0x40f6fb 4257531 (0: nrow: 248, level: 1)
leaf: 0x40f602 4257282 (-1: nrow: 228 rrow: 228)
leaf: 0x40f604 4257284 (0: nrow: 226 rrow: 226)
leaf: 0x40f605 4257285 (1: nrow: 224 rrow: 224)
leaf: 0x40f606 4257286 (2: nrow: 223 rrow: 223)
leaf: 0x40f607 4257287 (3: nrow: 217 rrow: 217)
leaf: 0x40f608 4257288 (4: nrow: 253 rrow: 253)
leaf: 0x40f609 4257289 (5: nrow: 232 rrow: 232)
............................................
............................................
leaf: 0x40f6f8 4257528 (244: nrow: 191 rrow: 191)
leaf: 0x40f6f9 4257529 (245: nrow: 181 rrow: 181)
leaf: 0x40f6fa 4257530 (246: nrow: 99 rrow: 99)
----- end tree dump www.2cto.com
解释trc文件
每一行第一列表示:节点类型,branch是分支节点(包括了根节点),而leaf则是叶子节点
第二列表示:节点地址,16进制
第三列表示:节点地址,10进制
第四列表示:相对于前一个节点的位置:根节点从0算起,其他分支节点和叶子节点从1开始算
第五列表示:(nrow)当前节点所含索引条目的数量(包括delete的条目)
第六列表示:(level)分支节点的层级,在oracle的索引中,层级号是倒过来的,也就是说假设某个索引有N层,则根节点的层级号为N,而根节点下一层的分支节点的层级号为N-1
第七列表示:(rrow)有效的索引条目的数量,因为索引条目如果被删除,不会立即被清除出索引块中。所以nrow减rrow的数量就表示已经被删除的索引条目数量
上面这种方式以树状形式转储整个索引。同时,我们可以转储一个索引节点来看看其中存放了些什么。
下面转储根节点的索引块内容。
从trc文件可知:根节点branch: 0x40efaa 4255658 (0: nrow: 2, level: 2)
[sql]
sys@ORCL> select dbms_utility.data_block_address_file(4255658 ) fno,
2 dbms_utility.data_block_address_block(4255658 ) bno
3 from dual;
FNO BNO
---------- ----------
1 61354
sys@ORCL> alter system dump datafile 1 block 61354;
www.2cto.com
System altered.
sys@ORCL> oradebug tracefile_name
/u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc
查看root节点的trc内容
[sql]
header address 230057028=0xdb66444
kdxcolev 2
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 1
kdxcofbo 30=0x1e
kdxcofeo 8026=0x1f5a
kdxcoavs 7996
kdxbrlmc 4257283=0x40f603
kdxbrsno 0
kdxbrbksz 8056
kdxbr2urrc 0
row#0[8026] dba: 4257531=0x40f6fb
col 0; len 18; (18): 41 4c 4c 5f 43 4f 4c 5f 50 52 49 56 53 5f 4d 41 44 45
col 1; len 6; (6): 00 40 ee c5 00 2c www.2cto.com
----- end of branch block dump -----
kdxcolev 表示:索引层级号,我们这个例子中,根节点的level是2,叶子该是0
kdxcolok 表示:该索引上是否有DML活动事务
kdxconco 表示:索引条目中列的数量
kdxcosdc 表示:索引结构发生变化的数量,当你修改某个索引键值时,该值加1
kdxconro 表示:当前索引节点中索引条目的数量
kdxcofbo 表示:当前索引节点从第几个字节开始记录
kdxco