~~Branch and Root~~
看看插入第8条数据后,会怎么样?
[php]
SQL> insert into t values(8);
1 row created.
SQL> commit;
Commit complete.
SQL> ANALYZE INDEX TI VALIDATE STRUCTURE;
Index analyzed.
SQL> select btree_space,used_space,pct_used,blocks,lf_blks,br_blks from index_stats;
BTREE_SPACE USED_SPACE PCT_USED BLOCKS LF_BLKS BR_BLKS
----------- ---------- ---------- ---------- ---------- ----------
24032 8305 35 8 2 1
[/php]
发现BTREE_SPACE=3个blocks的大小了,并且有2个leaf notes;1个branch,也就是root,单独占一个block;
因为两个leaf notes不能只是傻乎乎的排列在那里,必须有上一层的branch(root) note管理他们;
并且你会发现,这个root占用的block是最开始的那个leaf占用的block 250;
而将那个leaf 中的entries转移到后面的block(251)中去了;
同时插入的第8行数据,放在了新的block中(252);
为什么将第一个leaf转移到后面的block,而将这个block作为root,是因为root的信息保存在数据字典中,若修改数据字典的代价要会更大一些。
看看trace,证实上面的说法:
[php]
SQL> alter system dump datafile 3 block 250; 'root'
System altered.
[/php]
'trace..
注意:
brach中的每个entry有2个columns:
一个是他的child block中的最大值,另一个是他下一层block的address'
kdxbrbksz 8060
row#0[8053] dba: 12583164=0xc000fc
col 0; len 1; (1): 38 '38代表8,即最大值'
col 1; TERM
----- end of branch block dump -----
End dump data blocks tsn: 8 file#: 3 minblk 250 maxblk 250
[php]
SQL> alter system dump datafile 3 block 251;
System altered.
[/php]
'trace..发现row的顺序没有变,但是物理偏移量正好和原来相反了791~7001'
...
row#0['791'] flag: -----, lock: 0
col 0; len 1024; (1024):
31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
col 1; len 6; (6): 00 c0 00 da 00 00
row#1[1826] flag: -----, lock: 0
col 0; len 1024; (1024):
32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
...
row#6['7001'] flag: -----, lock: 0
col 0; len 1024; (1024):
37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
col 1; len 6; (6): 00 c0 00 da 00 06
----- end of leaf block dump -----
[php]
SQL> alter system dump datafile 3 block 252;
System altered.
[/php]
'trace..'
row#0[7001] flag: -----, lock: 0
col 0; len 1024; (1024): '38代表8'
38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...