一,创建测试表并且收集统计信息。
SQL> create table test as select*from sales;
Table created.
SQL> create index test_inx1 on test(prod_id,cust_id,time_id,channel_id);
Index created.
SQL> begin
2 dbms_stats.gather_table_stats(ownname =>'SH',
3 tabname =>'TEST',
[@more@]
4 estimate_percent =>40,
5 method_opt =>'for all columns size auto',
6 cascade =>TRUE);
7 end;
8 /
二,索引的统计信息。
PL/SQL procedure successfully completed.
NAME BLEVEL LEAF_BLKS DST_KEYS NUM_ROWS CLUST_FACT LEAF_PER_KEY DATA_PER_KEY
---------- ------- ---------- ---------- ---------- ---------- ------------ ------------
TEST_INX1 2 3935 950705 950705 782420 1 1
三,转储BTree结构信息
SQL> select object_id from dba_objects where object_Name='TEST_INX1';
OBJECT_ID
----------
71042
SQL>alter session set events'immediate trace name treedump level 71042';
------------------------------------------------------------------------
215 branch: 0x1000334 16778036 (0: nrow: 10, level: 2)
216 branch: 0x1001548 16782664 (-1: nrow: 429, level: 1)
217 leaf: 0x1000335 16778037 (-1: nrow: 248 rrow: 248)
218 leaf: 0x1000336 16778038 (0: nrow: 247 rrow: 247)
...
646 branch: 0x10016f7 16783095 (0: nrow: 424, level: 1)
647 leaf: 0x1001547 16782663 (-1: nrow: 247 rrow: 247)
648 leaf: 0x1001549 16782665 (0: nrow: 247 rrow: 247)
649 leaf: 0x100154a 16782666 (1: nrow: 247 rrow: 247)
...
1071 branch: 0x10018b4 16783540 (1: nrow: 436, level: 1)
1072 leaf: 0x10016f6 16783094 (-1: nrow: 239 rrow: 239)
1073 leaf: 0x10016f8 16783096 (0: nrow: 239 rrow: 239)
1074 leaf: 0x10016f9 16783097 (1: nrow: 239 rrow: 239)
...
1508 branch: 0x1001a75 16783989 (2: nrow: 442, level: 1)
1509 leaf: 0x10018b3 16783539 (-1: nrow: 247 rrow: 247)
1510 leaf: 0x10018b5 16783541 (0: nrow: 247 rrow: 247)
...
1951 branch: 0x1001c1f 16784415 (3: nrow: 417, level: 1)
1952 leaf: 0x1001a74 16783988 (-1: nrow: 248 rrow: 248)
1953 leaf: 0x1001a76 16783990 (0: nrow: 247 rrow: 247)
1954 leaf: 0x1001a77 16783991 (1: nrow: 247 rrow: 247)
...
2369 branch: 0x1001dbf 16784831 (4: nrow: 409, level: 1)
2370 leaf: 0x1001c1e 16784414 (-1: nrow: 239 rrow: 239)
2371 leaf: 0x1001c20 16784416 (0: nrow: 239 rrow: 239)
2372 leaf: 0x1001c21 16784417 (1: nrow: 239 rrow: 239)
...
2779 branch: 0x1001f55 16785237 (5: nrow: 399, level: 1)
2780 leaf: 0x1001dbe 16784830 (-1: nrow: 239 rrow: 239)
2781 leaf: 0x1001dc0 16784832 (0: nrow: 239 rrow: 239)
2782 leaf: 0x1001dc1 16784833 (1: nrow: 237 rrow: 237)
...
3179 branch: 0x10020fa 16785658 (6: nrow: 414, level: 1)
3180 leaf: 0x1001f54 16785236 (-1: nrow: 239 rrow: 239)
3181 leaf: 0x1001f56 16785238 (0: nrow: 239 rrow: 239)
3182 leaf: 0x1001f57 16785239 (1: nrow: 239 rrow: 239)
3183 leaf: 0x1001f58 16785240 (2: nrow: 239 rrow: 239)
...
3594 branch: 0x10022af 16786095 (7: nrow: 428, level: 1)
3595 leaf: 0x10020f9 16785657 (-1: nrow: 239 rrow: 239)
3596 leaf: 0x10020fb 16785659 (0: nrow: 239 rrow: 239)
3597 leaf: 0x10020fc 16785660 (1: nrow: 239 rrow: 239)
...
4023 branch: 0x10022b7 16786103 (8: nrow: 8, level: 1)
4024 leaf: 0x10022ae 16786094 (-1: nrow: 231 rrow: 231)
4025 leaf: 0x10022b0 16786096 (0: nrow: 231 rrow: 231)
4026 leaf: 0x10022b1 16786097 (1: nrow: 231 rrow: 231)
--------------------------------------------------------------
1.此索引有三个层次,每个leaf block大约有231-248行。
2.每一行的第一列表示节点类型:branch表示分支节点(包括根节点),而leaf则表示叶子节点;
3.第二列表示十六进制表示的节点的地址;第三列表示十进制表示的节点的地址;
4.第四列表示相对于前一个节点的位置,根节点从0开始计算,其他分支节点和叶子节点从-1开始计算;
5.第五列的nrow表示当前节点中所含有的索引条目的数量。
比如我们可以看到根节点中含有的nrow为10,表示根节点中含有10个索引条目,分别指向10个分支节点;
6.第六列中的level表示分支节点的层级,对于叶子节点来说level都是0。第六列中的rrow表示有效的索引条目
(因为索引条目如果被删除,不会立即被清除出索引块中。所以nrow减rrow的数量就表示已经被删除的索引条目数量)的数量,
比如对于第一个leaf来说,其rrow为248,也就是说该叶子节点中存放了248个可用索引条目,分别指向表test的248条记录。
四.转储一个索引节点
上面索引中根节点的address是16778036
利用如下SQL转换成file#和block#
select dbms_utility.data_block_address_file(16783095) as file#,
dbms_utility.data_block_address_block(16778095) as block# from dual;
FILE# BLOCK#
---------- ----------
4 820
SQL> alter system dump datafile 4 block 820;
System altered.
摘取trace文件:
1055 Branch block dump
1056 =================
1057 header address 67465804=0x405724c
1058 kdxcolev 2
1059 KDXCOLEV Flags = - - -
1060 kdxcolok 0
1061 kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
1062 kdxconco 5
1063 kdxcosdc 0
1064 kdxconro 9
1065 kdxcofbo 46=0x2e
1066 kdxcofeo 7882=0x1eca
1067 kdxcoavs 7836
1068 kdxbrlmc 16782664=0x1001548
1069 kdxbrsno 0
1070 kdxbrbksz 8056
1071 kdxbr2urrc 0
其中kdxcolev表示索引层级号,由于转储的是根节点,所以其层级号为2。
对叶子节点来说该值为0;kdxcolok表示该索引上是否正在发生修改块结构的事务;
kdxcoopc表示内部操作代码;kdxconco表示索引条目中列的数量;
kdxcosdc表示索引结构发生变化的数量,当修改表里的某个索引键值时,该值增加;
kdxconro表示当前索引节点中索引条目的数量,但是不包括kdxbrlmc指针;
kdxcofbo表示当前索引节点中可用空间的起始点相对当前块的位移量;
kdxcofeo表示当前索引节点中可用空间的最尾端的相对当前块的位移量;
kdxcoavs表示当前索引块中的可用空间总量,也就是用kdxcofeo减去kdxcofbo得到的。
kdxbrlmc表示分支节点的地址,该分支节点存放了索引键值小于row#0(在转储文档后半部分显示)所含有的最小值的所有节点信息;
kdxbrsno表示最后一个被修改的索引条目号,这里看到是0,表示该索引是新建的索引;
kdxbrbksz表示可用数据块的空间大小。
1072 row#0[8042] dba: 16783095=0x10016f7
1073 col 0; len 2; (2): c1 19
1074 col 1; len 3; (3): c2 57 1e
1075 col 2; len 1; (1): 78
1076 col 3; TERM
1077 row#1[8029] dba: 16783540=0x10018b4
1078 col 0; len 2; (2): c1 1f
1079 col 1; len 4; (4): c3 02 33 60
1080 col 2; TERM
1081 row#2[8015] dba: 16783989=0x1001a75
1082 col 0; len 2; (2): c1 26
1083 col 1; len 3; (3): c2 1a 3a
1084 col 2; len 1; (1): 78
1085 col 3; TERM
1086 row#3[7992] dba: 16784415=0x1001c1f
1087 col 0; len 2; (2): c1 2e
1088 col 1; len 3; (3): c2 46 3c
1089 col 2; len 7; (7): 78 65 05 07 01 01 01
1090 col 3; len 2; (2): c1 04
1091 col 4; TERM
1092 row#4[7968] dba: 16784831=0x1001dbf
1093 col 0; len 3; (3): c2 02 11
1094 col 1; len 3; (3): c2 20 4f
1095 col 2; len 7; (7): 78 64 08 0b 01 01 01
1096 col 3; len 2; (2): c1 04
1097 col 4; TERM
1098 row#5[7955] dba: 16785237=0x1001f55
1099 col 0; len 3; (3): c2 02 17
1100 col 1; len 3; (3): c2 44 3a
1101 col 2; TERM
1102 row#6[7931] dba: 16785658=0x10020fa
1103 col 0; len 3; (3): c2 02 1e
1104 col 1; len 3; (3): c2 0f 55
1105 col 2; len 7; (7): 78 65 0c 10 01 01 01
1106 col 3; len 2; (2): c1 04
1107 col 4; TERM
1108 row#7[7907] dba: 16786095=0x10022af
1109 col 0; len 3; (3): c2 02 26
1110 col 1; len 3; (3): c2 23 39
1111 col 2; len 7; (7): 78 65 0a 12 01 01 01
1112 col 3; len 2; (2): c1 05
1113 col 4; TERM
1114 row#8[7882] dba: 16786103=0x10022b7
1115 col 0; len 3; (3): c2 02 31
1116 col 1; len 4; (4): c3 02 1c 58
1117 col 2; len 7; (7): 78 65 08 08 01 01 01
1118 col 3; len 2; (2): c1 05
1119 col 4; TERM
1120 ----- end of branch block dump -----
1121 End dump data blocks tsn: 4 file#: 4 minblk 820 maxblk 820
以上9个索引条目加上kdxbrlmc所指向的第一个分支节点共是10个索引条目。每个条目指向索引的一个branch节点。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25586587/viewspace-1053509/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25586587/viewspace-1053509/