index block split相关一些知识

网上摘录关于index block split相关一些知识
1,index block split发生时,要从index segment header的free list获取分配空间;
2,更新一些segment metadata blocks我理解把分裂的信息记录在里面
3,如index block删除,标记为free,仍旧还要更新到一些segment metadata blocks中
4,如果index block split或删除并发很高,在rac环境产生大量的gc buffer busy waits(因为在等待这个split index block)
5,使用freelist管理方式即更新segment header block(index),这样就导致上述的等待很多
6,oracle引入了freelist groups减轻这个竞争压力,你可以手工重构segments改变
  freelist groups的数量;
 
  freelist groups它不会和其它的freelist groups分享空块列表
 
7,assm产生就是为了解决上述的问题不用再手工重配置

8,assm减少segment space management metadata block的竞争压力.
  也不用手工重建freelist groups
 
9,而且assm还有其它的一些好处,根据oracle pid用hash function把新插入的记录存储到不同的数据块中


----------------------------------------
1,assm时代,用bitmap代替了 freelist
2,对于index我们知道一般情况下一个新的条目只能属于一个特定的leaf block;
  但若刚好这个新条目插入到索引的最右边索引块,且这个索引块FULL了,此时要分配一个新的索引块
3,大家可以想一想,如果大量并发时,有键值相近的很多insert操作,它们就会hang在同一个leaf block;
   当然你可以用反向键索引,但会产生其它的问题(不能用范围扫描)
    
    
-----------------------------------------------------------------------
---索引块分裂分为50:50和90:10分裂,前者是最普通的一种方式,后者即插入键值大于当前最大键值,
---即在索引的最大右边叶子块不能容纳最新插键值时发生

----刚初建的索引

branch: 0x2835ceb 42163435 (0: nrow: 3, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)--三个叶子块的条目总数为1000即表记录数
   leaf: 0x2835ced 42163437 (0: nrow: 479 rrow: 479)
   leaf: 0x2835cee 42163438 (1: nrow: 36 rrow: 36)

--插入一个中间键后的索引  (如何知道每个叶子块存储最大条目数,即可以定位叶子块分裂的时间)
branch: 0x2835ceb 42163435 (0: nrow: 3, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)
   leaf: 0x2835ced 42163437 (0: nrow: 480 rrow: 480) ---第二个叶子块未分裂,但叶子块的条目增加了1个,即新增的键值
   leaf: 0x2835cee 42163438 (1: nrow: 36 rrow: 36) 

--再插入一个中间键后的索引
branch: 0x2835ceb 42163435 (0: nrow: 3, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)
   leaf: 0x2835ced 42163437 (0: nrow: 481 rrow: 481)--同上
   leaf: 0x2835cee 42163438 (1: nrow: 36 rrow: 36)  
  
--插入多个中间键值后的索引,增加一个叶子块  
branch: 0x2835ceb 42163435 (0: nrow: 4, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)
   leaf: 0x2835ced 42163437 (0: nrow: 316 rrow: 316) --原叶子块保留一部分条目,
   leaf: 0x2835cef 42163439 (1: nrow: 265 rrow: 265) --新增加的叶子块,原叶子块拆分一些条目插入到这个叶子块中
   leaf: 0x2835cee 42163438 (2: nrow: 36 rrow: 36)

--可知发生了叶子块分裂  
SQL> select b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name like '%split%'  and sid in(select sid from v$mystat where rownum=1);
 
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
leaf node splits                                                          1
leaf node 90-10 splits                                                    0
branch node splits                                                        0
root node splits                                                          0
queue splits                                                              0
     
     
---再看后者:90:10索引块分裂

--插入多个最大键值后的索引
branch: 0x2835ceb 42163435 (0: nrow: 4, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)
   leaf: 0x2835ced 42163437 (0: nrow: 316 rrow: 316)
   leaf: 0x2835cef 42163439 (1: nrow: 265 rrow: 265)
   leaf: 0x2835cee 42163438 (2: nrow: 536 rrow: 536)

--未发现  leaf node 90-10 splits 
SQL> select b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name like '%split%'  and sid in(select sid from v$mystat where rownum=1);
 
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
leaf node splits                                                          1
leaf node 90-10 splits                                                    0
branch node splits                                                        0
root node splits                                                          0
queue splits                                                              0       

--继续插入最大键值多少后的索引,发现了叶子块分裂
branch: 0x2835ceb 42163435 (0: nrow: 5, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485)
   leaf: 0x2835ced 42163437 (0: nrow: 316 rrow: 316)
   leaf: 0x2835cef 42163439 (1: nrow: 265 rrow: 265)
   leaf: 0x2835cee 42163438 (2: nrow: 568 rrow: 568)
   leaf: 0x2843774 42219380 (3: nrow: 468 rrow: 468)

--发生了1次叶子块分裂  
SQL> select b.name,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and b.name like '%split%'  and sid in(select sid from v$mystat where rownum=1);
 
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
leaf node splits                                                          2
leaf node 90-10 splits                                                    1
branch node splits                                                        0
root node splits                                                          0
queue splits                                                              0
   
另:索引的在物理不会有序,因为删除的条目如标记为free,会被重用;故物理不会有序;

 

*** 2013-03-19 13:25:05.694
----- begin tree dump
branch: 0x2835ceb 42163435 (0: nrow: 222, level: 1)
   leaf: 0x2835cec 42163436 (-1: nrow: 485 rrow: 485) --就以这个为基础测试
   leaf: 0x2835ced 42163437 (0: nrow: 479 rrow: 479)
   --略
----- end tree dump


--插入键值为1后的索引
leaf: 0x2835cec 42163436 (-1: nrow: 486 rrow: 486)   --叶子块增加一个条目

--重复上述动作
leaf: 0x2835cec 42163436 (-1: nrow: 487 rrow: 487)

leaf: 0x2835cec 42163436 (-1: nrow: 488 rrow: 488)---变成488

--添加多次键值后,发生了,出现了branch block split
----- begin tree dump
branch: 0x2835ceb 42163435 (0: nrow: 22, level: 2)
   branch: 0x2843af3 42220275 (-1: nrow: 319, level: 1)
      leaf: 0x2835cec 42163436 (-1: nrow: 279 rrow: 279) --由之前的488变为279;而且分支块分裂很占用资源
     

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

转载于:http://blog.itpub.net/9240380/viewspace-756516/

你可能感兴趣的:(index block split相关一些知识)