B*树索引(balanced tree)
建表,并插入一百万数据
SQL> create table t(id number,name varchar(10));
Table created.
SQL> declare
2 i number;
3 begin
4 for i in 1 .. 1000000
5 loop
6 insert into t values(i,'id'||i);
7 end loop;
8 end;
9 /
PL/SQL procedure successfully completed.
dump出索引的结构
首先求出object_id:
SQL> select object_id from dba_objects where object_name='T' and object_type='INDEX';
OBJECT_ID
----------
10338
SQL> alter session set events 'immediate trace name treedump level 10338';
trace文件的部分内容
Session altered.
*** 2013-10-11 19:24:23.152
*** SERVICE NAME:(SYS$USERS) 2013-10-11 19:24:23.121
*** SESSION ID:(147.155) 2013-10-11 19:24:23.121
----- begin tree dump
branch: 0x407bd2 4226002 (0: nrow: 4, level: 2)
branch: 0x4081ac 4227500 (-1: nrow: 672, level: 1)
leaf: 0x407bd3 4226003 (-1: nrow: 485 rrow: 485)
leaf: 0x407bd4 4226004 (0: nrow: 479 rrow: 479)
leaf: 0x407bd5 4226005 (1: nrow: 479 rrow: 479)
leaf: 0x407bd6 4226006 (2: nrow: 479 rrow: 479)
leaf: 0x407bd7 4226007 (3: nrow: 479 rrow: 479)
leaf: 0x407bd3 4226003 (-1: nrow: 485 rrow: 485)
表示叶子块的文件位置在哪,以及此块含有485条数据,
0x407bd3 转换为十进制就是4226003
SQL> select to_number('407bd3','xxxxxxxxx') from dual;
TO_NUMBER('407BD3','XXXXXXXXX')
-------------------------------
4226003
通过自身提供的一个包可以求出相应的数据文件号以及块号:
SQL> select dbms_utility.data_block_address_file('4226003') from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE('4226003')
-----------------------------------------------
1
SQL> select dbms_utility.data_block_address_block('4226003') from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK('4226003')
------------------------------------------------
31699
dump出1号文件第31699块:
部分内容
kdxconro 485-----485条数据与上述索引结构描述的一致
kdxcofbo 1006=0x3ee
kdxcofeo 1834=0x72a
kdxcoavs 828
kdxlespl 0
kdxlende 0
kdxlenxt 4226004=0x407bd4
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 02
col 1; len 6; (6): 00 40 73 7a 00 00
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 00 40 73 7a 00 01
row#2[8000] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 04
col 1; len 6; (6): 00 40 73 7a 00 02
row#3[7988] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 05
col 1; len 6; (6): 00 40 73 7a 00 03
row#4[7976] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 06
col 1; len 6; (6): 00 40 73 7a 00 04
---------------------------------------------------
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 02
col 1; len 6; (6): 00 40 73 7a 00 00
表示索引的第一行,有两列,索引列为2,另一列为在 00 40 73 7a 00 00所对应的块中
内部存储c102表示的数字:
SQL> select utl_raw.cast_to_number('C102') from dual;
UTL_RAW.CAST_TO_NUMBER('C102')
------------------------------
1
SQL> select * from t where rownum<2;
ID NAME
---------- ----------
1 id1
即id列的第一行
00 40 73 7a 00 00转换为二进制
00000000 01
000000 01110011 01111010
00000000 00000000
前10位:
00000000 01为rowid中的相对文件编号---------1号文件
中间22位:000000 01110011 01111010表示块号------29562块
后16位:00000000 00000000表示块中的第几行----------第0行
dump出1号文件的29562号块:
SQL> alter system dump datafile 1 block 29562;
System altered.
block_row_dump:
tab 0, row 0, @0x1f96
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 02-----------------------1
col 1: [ 3] 69 64 31------------------id1
tab 0, row 1, @0x1f8c
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [ 3] 69 64 32
tab 0, row 2, @0x1f82
内部存储69 64 31所对应的字符串为:
SQL> select utl_raw.cast_to_varchar2('696431') value from dual;
VALUE
---------------------------------------------------------------
id1
即表中的第一行。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29014732/viewspace-774188/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29014732/viewspace-774188/