[20131015]关于索引块分裂.txt

[20131015]关于索引块分裂.txt

前几天看了链接:http://www.askmaclean.com/archives/index-split.html

提到:
oracle中的索引块分裂主要分成 以下几种:

    leaf node 90-10 splits
    leaf node 50-50 splits
    branch node splits
    root node splits

按照 leaf Block Split 分裂时的行为 又可以分为:

leaf node 90-10 splits    插入到索引leaf block叶子块中的索引键是该块中最大的键值(包括块中已删除的索引键值)。 在此种情况
下实施 90-10 split( 实际是 99-1 ),原叶子块仍保持99%的full, 而到另一个空的叶子块中插入该条新的最大键值记录。

--我一直以为仅仅插入键值最大,并且该索引块已经满的情况下出现90-10 splits。而不是该块中最大的键值。
--自己做一个例子测试看看。

SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t as select rownum id,'testtest' name from dual connect by level
create index i_t_all pctfree 0 on t(id,name) pctfree 0;
SCOTT@test> select * from dba_objects where wner=user and object_name='I_T_ALL';
OWNER  OBJECT_NAME          SUBOBJECT_  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED             LAST_DDL_TIME       TIMESTAMP           STATUS  T G S  NAMESPACE EDITION_NAME
------ -------------------- ---------- ---------- -------------- ------------------- ------------------- ------------------- ------------------- ------- - - - ---------- ------------------------------
SCOTT  I_T_ALL                             274898         274898 INDEX               2013-10-15 15:51:30 2013-10-15 15:51:30 2013-10-15:15:51:30 VALID   N N N          4
SCOTT@test> alter session set events 'immediate trace name treedump level 274898';
Session altered.

--查看跟踪文件内容如下:
----- begin tree dump
branch: 0x1000213 16777747 (0: nrow: 3, level: 1)
   leaf: 0x1000214 16777748 (-1: nrow: 337 rrow: 337)
   leaf: 0x1000215 16777749 (0: nrow: 333 rrow: 333)
   leaf: 0x1000216 16777750 (1: nrow: 330 rrow: 330)
----- end tree dump

第1个节点满放337条键值。

SCOTT@test> @dfb 1000214
old   2: dbms_utility.data_block_address_file(to_number('&1','xxxxxxxxxxxxxxxx')) rfile#,
new   2: dbms_utility.data_block_address_file(to_number('1000214','xxxxxxxxxxxxxxxx')) rfile#,
old   3: dbms_utility.data_block_address_block(to_number('&&1','xxxxxxxxxxxxxxxx')) block#
new   3: dbms_utility.data_block_address_block(to_number('1000214','xxxxxxxxxxxxxxxx')) block#
    RFILE#     BLOCK#
---------- ----------
         4        532

old   1: select 'alter system dump datafile '||dbms_utility.data_block_address_file(to_number('&1','xxxxxxxxxxxxxxxx'))||' block '||
new   1: select 'alter system dump datafile '||dbms_utility.data_block_address_file(to_number('1000214','xxxxxxxxxxxxxxxx'))||' block '||
old   2: dbms_utility.data_block_address_block(to_number('&&1','xxxxxxxxxxxxxxxx')) ||' ;' text
new   2: dbms_utility.data_block_address_block(to_number('1000214','xxxxxxxxxxxxxxxx')) ||' ;' text
TEXT
--------------------------------------------------------------------------------------------------------------------
alter system dump datafile 4 block 532 ;

SCOTT@test> alter system dump datafile 4 block 532 ;
System altered.

--查看跟踪文件内容如下:
row#0[8011] flag: ------, lock: 0, len=21
col 0; len 2; (2):  c1 02
col 1; len 8; (8):  74 65 73 74 74 65 73 74
col 2; len 6; (6):  01 00 02 0b 00 00
...
row#336[720] flag: ------, lock: 0, len=22
col 0; len 3; (3):  c2 04 26
col 1; len 8; (8):  74 65 73 74 74 65 73 74
col 2; len 6; (6):  01 00 02 0b 01 50
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 532 maxblk 532

--转储情况也是一致的。

2.这样新建立表T1:
create table t1 as select * from t  where id338 order by id;
create index i_t1_all on t1(id,name) pctfree 0 ;

SCOTT@test> select * from dba_objects where wner=user and object_name='I_T1_ALL';
OWNER  OBJECT_NAME          SUBOBJECT_  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED             LAST_DDL_TIME       TIMESTAMP           STATUS  T G S  NAMESPACE EDITION_NAME
------ -------------------- ---------- ---------- -------------- ------------------- ------------------- ------------------- ------------------- ------- - - - ---------- ------------------------------
SCOTT  I_T1_ALL                            274905         274905 INDEX               2013-10-15 16:21:10 2013-10-15 16:21:10 2013-10-15:16:21:10 VALID   N N N          4

SCOTT@test> alter session set events 'immediate trace name treedump level 274905';
Session altered.

--查看跟踪文件内容如下:
----- begin tree dump
branch: 0x1000223 16777763 (0: nrow: 3, level: 1)
   leaf: 0x1000224 16777764 (-1: nrow: 337 rrow: 337)
   leaf: 0x1000225 16777765 (0: nrow: 333 rrow: 333)
   leaf: 0x1000226 16777766 (1: nrow: 329 rrow: 329)
----- end tree dump

--这样如果插入:insert into t1 values (337,'testtest');看看索引的分裂是什么形式?
--退出再进入:

SCOTT@test> column name format a30
SCOTT@test> select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
       SID STATISTIC#      VALUE NAME
---------- ---------- ---------- ------------------------------
       192        412          0 leaf node splits
       192        413          0 leaf node 90-10 splits

SCOTT@test> insert into t1 values (338,'testtest');
1 row created.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
       SID STATISTIC#      VALUE NAME
---------- ---------- ---------- ------------------------------
       192        412          1 leaf node splits
       192        413          0 leaf node 90-10 splits

--发生了分裂。但是并不是90-10 splits。而是50-50分裂!

----- begin tree dump
branch: 0x1000223 16777763 (0: nrow: 4, level: 1)
   leaf: 0x1000224 16777764 (-1: nrow: 176 rrow: 176)
   leaf: 0x1000227 16777767 (0: nrow: 162 rrow: 162)
   leaf: 0x1000225 16777765 (1: nrow: 333 rrow: 333)
   leaf: 0x1000226 16777766 (2: nrow: 329 rrow: 329)
----- end tree dump

-- 176 + 162  = 338 结果也正确。
--测试说明leaf node 90-10 splits仅仅发生在插入最大的键值,而不是该块中最大的键值(包括块中已删除的索引键值)。 

时间: 2024-08-31 17:53:44

[20131015]关于索引块分裂.txt的相关文章

[20111223]索引键值在B tree索引块中的顺序.txt

[20111223]索引键值在B tree索引块中的顺序.txt 参考链接:http://www.adellera.it/blog/2009/05/24/order-keys-inside-index-blocks/ 自己为了加强理解重复一下对方的测试! 1.建立测试表以及索引 SQL> select * from v$version; BANNER -------------------------------------------------------------------------

[20150626]建立索引pctfree=0.txt

[20150626]建立索引pctfree=0.txt --昨天看了链接: https://richardfoote.wordpress.com/2015/06/25/quiz-time-why-do-deletes-cause-an-index-to-grow-up-the-hill-backwards/ --自己测试看看来解答问题,不知道是否正确:-) 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION    

[20160711]索引键值在Btree索引块中的顺序3

[20160711]索引键值在B tree索引块中的顺序3.txt --上午测试索引键值在B tree索引块中的顺序,许多人认为是有序,主要是插入后再建立索引. --这样看到索引块里面的键值就是有序的. --今天测试一下,如果索引分裂后是否会排序呢?索引分裂有两种情况,前面测试leaf node 50-50 splits的情况. --继续测试leaf node 90-10 splits的情况. 测试看看. 1.环境: SCOTT@test01p> @ ver1 PORT_STRING      

[20160711索引键值在B tree索引块中的顺序2

[20160711]索引键值在B tree索引块中的顺序2.txt --上午测试索引键值在B tree索引块中的顺序,许多人认为是有序,主要是插入后再建立索引. --这样看到索引块里面的键值就是有序的. --今天测试一下,如果索引分裂后是否会排序呢?索引分裂有两种情况,先测试leaf node 50-50 splits的情况. 测试看看. 1.环境: SCOTT@test01p> @ ver1 PORT_STRING                    VERSION        BANNE

[20150304]唯一索引与阻塞.txt

[20150304]唯一索引与阻塞.txt --昨天帮别人定位一个唯一索引导致出现ora-00001的问题,实际上很简单,程序使用max(id)取得最大号,然后插入,这样的结果在业务 --高峰,出现阻塞或者ora-00001错误.我仅仅简单做一下跟踪很容易定位这个问题. --换一个角度,使用别的方法是否可行呢,自己做一个例子来验证看看. 1.建立测试环境: SCOTT@test> create table t as select rownum id,cast ( 'test' as varcha

[20121015]探索索引-学习bbed.txt

[20121015]探索索引-学习bbed.txt 参考链接:http://www.adellera.it/blog/2009/05/24/order-keys-inside-index-blocks/ 1.探索索引 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Ent

[20170926]tune2fs调整保留块百分比.txt

[20170926]tune2fs调整保留块百分比.txt --//今天春节后给生产系统dg增加磁盘空间,在建立文件系统时没有调整保留区百分比. --//当时想都建立文件系统,也开始转移文件了.再重新来非常麻烦.也就放弃了. --//正好前一段时间使用tune2fs修改文件系统参数, --//参考链接 --//[20141229]关于linux文件系统的一些问题.txt --//主要问题是linux服务器长期不重启,有几种情况会导致重启在fsck上浪费许多时间. # tune2fs -l /de

[20171202]关于函数索引的状态.txt

[20171202]关于函数索引的状态.txt --//我曾经在一篇贴子提到索引可以disable吗?链接: --//http://blog.itpub.net/267265/viewspace-2123537/ --//实际上仅仅函数索引能disable,为什么呢?实际上自己以前并不搞清楚实际上这个跟oracle使用函数的特殊性有关. --//如果一个表删除某个字段,对应的索引也会删除.如果定义的函数删除了,对应的函数索引呢?通过例子来说明问题: 1.环境: SCOTT@test01p> @

[20160831]关于数据块Checksum.txt

[20160831]关于数据块Checksum.txt --以前我学习bbed时做过一些测试,将'AAAA'替换成'BBBB',你可以发现数据块的Checksum并没有发生变化,当时并没有仔细探究, --现在想起来计算Checksum算法应该相对简单,就是做异或操作. --比如上面的字符'AAAA'如果2个字符按位做异或操作,变成00000000,这个正好巧合,如果修改成'CCCC',做相同的异或操作结果 --也是00000000. --如果按照这个推测修改为'CDCD',这样做异或操作的结果也