ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引数据块的重用机制探究(2)

索引数据块的重用机制探究(2)

原创 Linux操作系统 作者:lsq_008 时间:2011-04-19 20:24:05 0 删除 编辑
 

再看一下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)

 

可以看出,此时地址为8388708branch 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上有670leaf  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条数据后,2leaf block被从branch  8394943上摘除,剩下668leaf 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 上只剩下271leaf 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)          ----原来的地址为839943branch block已经被作为一个leaf block重用

      leaf: 0x801ef8 8396536 (280: nrow: 470 rrow: 470)

 

 

结论,对于顺序增长的索引来说:

 

  1. leaf block里的记录被删空后,如果索引需要分配新的存储空间,那么oracle可以将这个已经被删空的leaf block从其原来所属的branch上摘下来,并放置到合适的branch上。

 

  1. branch 下的所有leaf block全部被删空后(这也意味着branch block里的记录被删空),如果索引需要分配新的存储空间,那么oracle可以将这个已经被删空的brach block从其所属的上一级branch上摘下来,并放置到合适的branch上。

 

  1. 无论是leaf block还是branch block,只有在其上面的所有记录被删除后,才能得到重用。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-692907/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Semi join 与anti join
请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1255379