ITPub博客

首页 > 数据库 > Oracle > 索引的tree dump

索引的tree dump

原创 Oracle 作者:xiayulai 时间:2008-03-13 11:04:26 0 删除 编辑

实验表:

desc test

Name Null? Type

---------- -------- ----------------------------------------------

A VARCHAR2(30)

B NUMBER

C VARCHAR2(40)

Declare

Num number;

Begin

For num in 1..500000 loop

If mod(num,2)=0 then

Insert into test values('t'||num,num,'M');

Else

Insert into test values('t'||num,num,'F');

End if;

If mod(num,1000)=0 then

Commit;

End if;

End loop;

Commit;

End;

/

sql>Create index test_b_ind on test(b) tablespace users;

sql>select object_id from dba_objects where object_name='TEST_B_IND';

OBJECT_ID

----------

28903

1 row selected.

sql> alter session set events ‘immediate trace name treedump level 28903’;

到bdump目录下找到对应的trc文件,打开如下:

Index tree dump 结果分析

这是一个50万数据的一个表的索引

----- begin tree dump

branch: 0x500f76c 83949420 (0: nrow: 2, level: 2)

branch: 0x8c1424e 146883150 (-1: nrow: 672, level: 1)

leaf: 0x500f76d 83949421 (-1: nrow: 485 rrow: 485)

leaf: 0x500f76e 83949422 (0: nrow: 479 rrow: 479)

leaf: 0x500f76f 83949423 (1: nrow: 479 rrow: 479)

leaf: 0x500f770 83949424 (2: nrow: 479 rrow: 479)

leaf: 0x500f771 83949425 (3: nrow: 479 rrow: 479)

………

leaf: 0x500f8c5 83949765 (664: nrow: 449 rrow: 449)

leaf: 0x500f8c6 83949766 (665: nrow: 449 rrow: 449)

leaf: 0x500f8c7 83949767 (666: nrow: 449 rrow: 449)

leaf: 0x500f8c8 83949768 (667: nrow: 449 rrow: 449)

leaf: 0x8c1424a 146883146 (668: nrow: 449 rrow: 449)

leaf: 0x8c1424b 146883147 (669: nrow: 449 rrow: 449)

leaf: 0x8c1424c 146883148 (670: nrow: 449 rrow: 449)

branch: 0x8c1dece 146923214 (0: nrow: 441, level: 1)

leaf: 0x8c1424d 146883149 (-1: nrow: 449 rrow: 449)

leaf: 0x8c1424f 146883151 (0: nrow: 449 rrow: 449)

leaf: 0x8c14250 146883152 (1: nrow: 449 rrow: 449)

leaf: 0x8c14251 146883153 (2: nrow: 449 rrow: 449)

leaf: 0x8c14252 146883154 (3: nrow: 449 rrow: 449)

leaf: 0x8c14253 146883155 (4: nrow: 449 rrow: 449)

………

leaf: 0x500f9a8 83949992 (435: nrow: 449 rrow: 449)

leaf: 0x8c1deca 146923210 (436: nrow: 449 rrow: 449)

leaf: 0x8c1decb 146923211 (437: nrow: 449 rrow: 449)

leaf: 0x8c1decc 146923212 (438: nrow: 449 rrow: 449)

leaf: 0x8c1decd 146923213 (439: nrow: 84 rrow: 84)

----- end tree dump

对这个结构进行简单的分析

branch: 0x500f76c 83949420 (0: nrow: 2, level: 2)

这个是root节点,有两条记录保存,其level为2,现在来看level为2表示有三层(root--branch--leaf)。nrow:2是说下面有2个子节点,其实是指向下面子节点的指针。

这两个节点就是root节点指向的节点。

branch: 0x8c1424e 146883150 (-1: nrow: 672, level: 1)

其里面包含有672个叶子节点

branch: 0x8c1dece 146923214 (0: nrow: 441, level: 1)

其里面包含有441个叶子节点

下面是叶子节点

leaf: 0x500f76d 83949421 (-1: nrow: 485 rrow: 485)

leaf: 0x500f76e 83949422 (0: nrow: 479 rrow: 479)

leaf: 0x500f76f 83949423 (1: nrow: 479 rrow: 479)

leaf: 0x500f770 83949424 (2: nrow: 479 rrow: 479)

leaf: 0x500f771 83949425 (3: nrow: 479 rrow: 479)

………

leaf: 0x500f8c5 83949765 (664: nrow: 449 rrow: 449)

leaf: 0x500f8c6 83949766 (665: nrow: 449 rrow: 449)

通过这些叶子节点来看,每个节点上存储的数据条数并不是完全相同的,里面存储的1-500000之间的不同的数字。计算了所有叶子节点的nrow,所有叶子节点共存储了500000条记录,这也说明,数据都是在叶子节点上存储。

其中 0x500f76d 83949421 均为dba,前面是16进制,后面是十进制,可以证明:

select to_char(83949420,'xxxxxxxxxxx') from dual;

TO_CHAR(8394

------------

500f76c

当索引range scan 扫描时,会从root开始向下查找,也就是一个查询如果只需要得到索引的数据的话其consistent gets 会有4个左右。[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7312700/viewspace-1000872/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: logmnr使用
请登录后发表评论 登录
全部评论
  • 博文量
    28
  • 访问量
    30208