首页 > Linux操作系统 > Linux操作系统 > 索引数据块的重用机制探究(2)
再看一下branch block的重用机制,删除一个branch block下的所有记录:
sys@EBANK>delete from test where id <=315840;
315340 rows deleted.
sys@EBANK>commit;
Commit complete.
----- begin tree dump
branch: 0x800064 8388708 (0: nrow: 4, level: 2)
branch: 0x8018bf 8394943 (-1: nrow: 671, level: 1)
leaf: 0x800066 8388710 (-1: nrow: 464 rrow: 0)
leaf: 0x800067 8388711 (0: nrow: 479 rrow: 0)
leaf: 0x800068 8388712 (1: nrow: 479 rrow: 0)
leaf: 0x800069 8388713 (2: nrow: 479 rrow: 0)
leaf: 0x80006a 8388714 (3: nrow: 478 rrow: 0)
leaf: 0x80006b 8388715 (4: nrow: 479 rrow: 0)
leaf: 0x80006c 8388716 (5: nrow: 479 rrow: 0)
…………..
…………..
leaf: 0x8018b9 8394937 (665: nrow: 449 rrow: 0)
leaf: 0x8018ba 8394938 (666: nrow: 449 rrow: 0)
leaf: 0x8018bb 8394939 (667: nrow: 449 rrow: 0)
leaf: 0x8018bc 8394940 (668: nrow: 449 rrow: 0)
leaf: 0x8018bd 8394941 (669: nrow: 449 rrow: 0)
branch: 0x801b68 8395624 (0: nrow: 670, level: 1)
可以看出,此时地址为8388708的branch block下所有的leaf block都被删空,然后分两次插入500条记录:
sys@EBANK>Begin
2 For I in 1000501 .. 1001000 loop
3 Insert into test values(I,to_char(i));
4 End loop;
5 Commit;
6 End ;
7 /
PL/SQL procedure successfully completed.
sys@EBANK>/
PL/SQL procedure successfully completed.
leaf: 0x800065 8388709 (213: nrow: 470 rrow: 470) 原来的最后一个leaf block
leaf: 0x801797 8394647 (214: nrow: 386 rrow: 386) 插入了500条数据后,原来第一个枝节点上的叶子块被重用
leaf: 0x800065 8388709 (213: nrow: 240 rrow: 240)
leaf: 0x80179b 8394651 (214: nrow: 344 rrow: 344) 再插入500条记录,又有两个原来第一个枝节点上的叶子块得到重用
leaf: 0x801797 8394647 (215: nrow: 310 rrow: 310)
leaf: 0x80179f 8394655 (216: nrow: 462 rrow: 462)
------原来的索引枝节点分布情况,branch 8394943上有670个leaf block:
[ora10g@single udump]$ grep branch standby_ora_32395.trc
branch: 0x800064 8388708 (0: nrow: 4, level: 2)
branch: 0x8018bf 8394943 (-1: nrow: 670, level: 1)
branch: 0x801b68 8395624 (0: nrow: 670, level: 1)
branch: 0x801e13 8396307 (1: nrow: 670, level: 1)
branch: 0x801eeb 8396523 (2: nrow: 216, level: 1)
-----插入了1000条数据后,2个leaf block被从branch 8394943上摘除,剩下668个leaf block:
branch: 0x800064 8388708 (0: nrow: 4, level: 2)
branch: 0x8018bf 8394943 (-1: nrow: 668, level: 1)
branch: 0x801b68 8395624 (0: nrow: 670, level: 1)
branch: 0x801e13 8396307 (1: nrow: 670, level: 1)
branch: 0x801eeb 8396523 (2: nrow: 218, level: 1)
-----插入了20万条数据后,branch 8394943上又有一部分leaf block被重用,该branch 上只剩下271个leaf block:
[ora10g@single udump]$ grep branch standby_ora_32453.trc
branch: 0x800064 8388708 (0: nrow: 5, level: 2)
branch: 0x8018bf 8394943 (-1: nrow: 271, level: 1)
branch: 0x801b68 8395624 (0: nrow: 640, level: 1)
branch: 0x801e13 8396307 (1: nrow: 670, level: 1)
branch: 0x801eeb 8396523 (2: nrow: 635, level: 1)
branch: 0x8016ca 8394442 (3: nrow: 9, level: 1)
----再插入15万条记录
sys@EBANK>Begin
2 For I in 1201000 .. 1351000 loop
3 Insert into test values(I,to_char(i));
4 End loop;
5 Commit;
6 End ;
7 /
PL/SQL procedure successfully completed.
先看一下索引的枝节点分布情况:
[ora10g@single udump]$ grep branch standby_ora_32496.trc
branch: 0x800064 8388708 (0: nrow: 4, level: 2) -----原来的branch block 839443已经消失
branch: 0x801b68 8395624 (-1: nrow: 640, level: 1)
branch: 0x801e13 8396307 (0: nrow: 670, level: 1)
branch: 0x801eeb 8396523 (1: nrow: 635, level: 1)
branch: 0x8016ca 8394442 (2: nrow: 328, level: 1)
再看一下索引的具体结构:
----- begin tree dump
branch: 0x800064 8388708 (0: nrow: 4, level: 2)
branch: 0x801b68 8395624 (-1: nrow: 640, level: 1)
leaf: 0x8018dd 8394973 (-1: nrow: 435 rrow: 435)
leaf: 0x8018de 8394974 (0: nrow: 449 rrow: 449)
leaf: 0x8018df 8394975 (1: nrow: 449 rrow: 449)
………….
………….
branch: 0x8016ca 8394442 (2: nrow: 328, level: 1)
leaf: 0x801705 8394501 (-1: nrow: 470 rrow: 470)
leaf: 0x8016ce 8394446 (0: nrow: 470 rrow: 470)
leaf: 0x8016d2 8394450 (1: nrow: 470 rrow: 470)
………..
……….
leaf: 0x80170f 8394511 (277: nrow: 470 rrow: 470)
leaf: 0x801713 8394515 (278: nrow: 470 rrow: 470)
leaf: 0x8018bf 8394943 (279: nrow: 470 rrow: 470) ----原来的地址为839943的branch block已经被作为一个leaf block重用
leaf: 0x801ef8 8396536 (280: nrow: 470 rrow: 470)
结论,对于顺序增长的索引来说:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-692907/ ,如需转载,请注明出处,否则将追究法律责任。