ITPub博客

首页 > Linux操作系统 > Linux操作系统 > B*树索引

B*树索引

原创 Linux操作系统 作者:Power08 时间:2013-10-11 19:11:37 0 删除 编辑
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  01000000  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

即表中的第一行。



utl_raw用法:http://space.itpub.net/?uid-29014732-action-viewspace-itemid-774190
rowid详解:http://space.itpub.net/?uid-29014732-action-viewspace-itemid-772798




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

下一篇: dump与utl_raw
请登录后发表评论 登录
全部评论

注册时间:2013-07-01

  • 博文量
    17
  • 访问量
    44562