网上摘录关于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/