oraclebtreeindex索引块结构初探(一)

2014-11-24 17:08:03 · 作者: · 浏览: 3

通过treedump查看索引结构

语法格式:alter session set events 'immediate trace name treedump level index_object_id'
SQL> create table t1(c1 varchar2(10));

表已创建。

SQL> create index i1 on t1(c1);

索引已创建。

SQL> select object_id from user_objects where object_name='I1';

 OBJECT_ID
----------
    364492

SQL> alter session set events 'immediate trace name treedump level 364492';

trace file 内容:
branch: 0xb0ae6ac 185263788 (0: nrow: 2, level: 2)
   branch: 0xb11227c 185672316 (-1: nrow: 460, level: 1)
      leaf: 0xb0ae6ad 185263789 (-1: nrow: 317 rrow: 317)
      leaf: 0xb112153 185672019 (0: nrow: 295 rrow: 295)
      leaf: 0xb0ae82f 185264175 (1: nrow: 281 rrow: 281)
      ...
      leaf: 0xb11211e 185671966 (457: nrow: 334 rrow: 334)
      leaf: 0xb0ae83c 185264188 (458: nrow: 338 rrow: 338)
   branch: 0xb112280 185672320 (0: nrow: 454, level: 1)
      leaf: 0xb112127 185671975 (-1: nrow: 303 rrow: 303)
      leaf: 0xb0ae6d6 185263830 (0: nrow: 304 rrow: 304)
      leaf: 0xb112165 185672037 (1: nrow: 300 rrow: 300)
      ...
      leaf: 0xb0ae810 185264144 (451: nrow: 398 rrow: 398)
      leaf: 0xb112143 185672003 (452: nrow: 401 rrow: 401)
----- end tree dump

块的类别:分支块和叶子块 块的rdba地址:十六进制和十进制
相对于上一级块结构的位置,从-1开始,root块从 0开始
nrows: 所有的记录数量(包括已删除的)
rrows: 当前包含的记录数量
level : 分支块的级别,叶子节点隐式为0

注意:oracle的btree index几乎总是平衡的。

怎样获取索引块的地址信息

oracle为我们提供了两个视图:dba_segments dba_extents. 通过这两个视图,我们可以查询索引的root块地址.
SQL> l
  1* select tablespace_name,segment_space_management from dba_tablespaces where tablespace_name in ('TS1','USERS')
SQL> /

TABLESPACE_NAME                SEGMEN
------------------------------ ------
TS1                            MANUAL
USERS                          AUTO

SQL> col segment_name for a20
SQL> col tablespace_name for a20
SQL> select segment_name,tablespace_name,header_file,header_block from dba_segments where owner='EASYPOINT' and segment_name like 'I%'
  2  /

SEGMENT_NAME         TABLESPACE_NAME      HEADER_FILE HEADER_BLOCK
-------------------- -------------------- ----------- ------------
I1                   USERS                         44       714411
I2                   TS1                           46           17

SQL> select segment_name,min(extent_id),min(block_id) from dba_extents where owner='EASYPOINT' and segment_name like 'I%' group by segment_name;

SEGMENT_NAME         MIN(EXTENT_ID) MIN(BLOCK_ID)
-------------------- -------------- -------------
I2                                0            17
I1                                0        714409

SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(192938002) FROM DUAL;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(192938002)
------------------------------------------------
                                              18

SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(185263788) FROM DUAL;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(185263788)
------------------------------------------------
                                          714412
从这个地方我们可以看出,root索引块的地址为dba_segments 中 header_block加1,在ASSM下,首extent的前2个数据块保存位图信息,第三个数据块为header_block. 在mssm下,首extents的第一个数据块即为HEADER_BLOCK.

查看索引块信息

语法格式:alter system dump datafile file_id block block_id; alter system dump datafile file_id block min block_id block max block_id;
dump root branch:
SQL> select dbms_utility.data_block_address_block(185263788) c1,dbms_utility.data_block_address_file(185263788) c2 from dual;

      C1       C2
-------- --------
  714412       44

SQL> oradebug setmypid
已处理的语句
SQL> oradebug tracefile_name
/oracle/admin/orcl/udump/orcl_ora_73926.trc
SQL> alter system dump datafile 44 block 714412;

系统已更改。

trace file 内容
*** 2013-12-13 11:52:38.766
Start dump data blocks tsn: 4 file#: 44 minblk 714412 maxblk 714412
buffer tsn: 4 rdba: 0x0b0ae6ac (44/714412)
scn: