Index internal 结构 试验一
上一篇 / 下一篇 2008-03-26 22:11:32 / 个人分类:数据库(oracle)
本文通过dump index的root块,branch块和leaf块,及相对应的table中的内容,来初步揭示index的一些内部结构信息,dump出来的文件作了概要的说明,供学习参考使用。
实验环境:windows xp,oracle 9i
SQL> drop table t;
SQL> create table t as select rownum t,a.* from dba_objects a;
SQL> create index t_idx on t(t);
SQL> select extent_id,file_id,block_id,blocks from dba_extents where segment_name='T_IDX' AND WNER='SYS';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 1 52153 8
1 1 52161 8
2 1 52177 8
3 1 52185 8
4 1 52193 8
5 1 52201 8
6 1 52209 8
7 1 52217 8
8 1 52225 8
SQL> ANALYZE INDEX T_IDX VALIDATE STRUCTURE;
SQL> SELECT height,blocks,lf_blks,br_blks,btree_space,used_space FROM INDEX_STATS WHERE NAME='T_IDX';
HEIGHT BLOCKS LF_BLKS BR_BLKS BTREE_SPACE USED_SPACE
---------- ---------- ---------- ---------- ----------- ----------
2 72 65 1 528032 465248
可以看到,该所引高度为2,只有1个branch块,同时也是root根节点,同时有65个leaf块。
Block 52153表示索引段头块,对于此处分析无大用途,再次省略
Block 52154 表示该索引的root 所在的块,dump该块,可以看到,branch 块中存在中指向下级叶块(有可能是叶块,也可能是分支块)的地址指针及叶块中的最小值,dump该块。
alter system dump datafile 1 block 52154;
…………………………………………….
seg/obj: 0x7800 csc: 0x00.5a071b itc: 1 flg: - typ: 2 - INDEX
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.005a071b
Branch block dump --表示该块ranch block
=================
header address 79040580=0x4b61044
kdxcolev 1
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y
kdxconco2
kdxcosdc 0
kdxconro64 –该块含有64个rows,即root根节点有64个指向叶块的指针
kdxcofbo 156=0x9c
kdxcofeo 7440=0x1d10
kdxcoavs 7284
kdxbrlmc4246459=0x40cbbb --第一个叶块地址前2位补0,即0000 0000 0100 0000 1100 1011 1011 1011, file 1 block 52155,为第一个index leaf 的块地址
kdxbrsno 0
kdxbrbksz 8060
row#0[8051] dba: 4246460=0x40cbbc–第二个索引叶块地址
col 0; len 3; (3): c2 05 57 -- c2 05 57表示486,即第二个叶块中的记录从t=486开始
col 1; TERM
row#1[8042] dba: 4246461=0x40cbbd
col 0; len 3; (3): c2 0a 42
col 1; TERM
………………………………………….省略了如果类似记录
………………………………………….
row#63[7440] dba: 4246531=0x40cc03–root块共有64条 记录,每条记录都有指向下一级块的指针
col 0; len 4; (4): c3 03 5e 46
col 1; TERM
----- end of branch block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 52154 maxblk 52154
转储 52155 块,看看该索引叶块的存储内容
SQL> alter system dump datafile 1 block 52155;
…………………………………..
kdxconco 2
kdxcosdc 0
kdxconro 485 --该索引叶块所存储的记录数
kdxcofbo 1006=0x3ee
kdxcofeo 1834=0x72a
kdxcoavs 828
kdxlespl 0
kdxlende 0
kdxlenxt 4246460=0x40cbbc–下一个叶块地址
kdxleprv 0=0x0 --上一个叶块地址,该块为第一个块,所以为0,可以验证:索引用双向链表来管理所有的叶块,这样就可以提高index range scan
kdxledsz 0
kdxlebksz 8036
row#0[8024] flag: -----, lock: 0
col 0; len 2; (2): c1 02 --c1 02表示数值型的 1,即t=1 的第一条记录
col 1; len 6; (6): 00 40 c9 3a 00 00 -- 0000 0000 0100 0000 1100 1001 0011 1010 file 1 block 51514 索引键值所在table的地址,00 00表示第一条记录
row#1[8012] flag: -----, lock: 0
col 0; len 2; (2): c1 03
col 1; len 6; (6): 00 40 c9 3a00 01
………………………………………省略了row#2至row#483 记录信息
row#484[1834] flag: -----, lock: 0
col 0; len 3; (3): c2 05 56 -- c2 05 56 表示t= 485
col 1; len 6; (6): 00 40 c9 41 00 0d
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 52155 maxblk 52155
SQL> alter system dump datafile 1 block 51514;
Dump对应table的所在块,截取dump出来的第一条记录,验证索引叶块中的索引条目中的确有指向对应table块的地址.
…………………….
block_row_dump:
tab 0, row 0, @0x1f25
tl: 99 fb: --H-FL-- lb: 0x0 cc: 14
col 0: [ 2] c1 02 -- 01
col 1: [ 3] 53 59 53 –表示sys
col 2: [22]
2f 31 30 30 35 62 64 33 30 5f 4c 6e 6b 64 43 6f 6e 73 74 61 6e 74
col 3: *NULL*
col 4: [ 4] c3 02 49 57
col 5: *NULL*
col 6: [10] 4a 41 56 41 20 43 4c 41 53 53
col 7: [ 7] 78 66 05 0c 11 34 1a
col 8: [ 7] 78 66 05 0c 11 34 1a
col 9: [19] 32 30 30 32 2d 30 35 2d 31 32 3a 31 36 3a 35 31 3a 32 35
col 10: [ 5] 56 41 4c 49 44
col 11: [ 1] 4e
col 12: [ 1] 4e
col 13: [ 1] 4e
……………………………………………以下dump内容省略
相关阅读:
- Oracle中不使用索引的几种情况分析 (oracle_kai, 2008-3-11)
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
