通过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: