理解index leaf node 90-10 split

理解index leaf node  90-10 split

当索引leaf满分裂时,存在两种情况:
1.如果插入的键值是最大值,分裂按照90-10 split.
2.如果不是,按照50-50分裂。

按照字面的理解90-10 split,就是90的键值保留在原来数据块中,其他10%键值使用新的数据块。实际情况如何呢?

1.建立测试表:
select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

create table t1(a varchar2(5),b varchar2(10));
create unique index i_t1_a on t1(a);

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
---------- ---------- ---------- ----------------------------------------------------------------
        11        382          0 leaf node splits
        11        383          0 leaf node 90-10 splits

begin
        for i in 1..501   loop
                insert into t1 values (lpad(to_char(i),5,'0') ,'test');
        end loop;
end;
/
commit;

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
---------- ---------- ---------- ----------------------------------------------------------------
        11        382          1 leaf node splits
        11        383          1 leaf node 90-10 splits

应该产生一次leaf node 90-10 splits。

2. 分析索引结构:

SQL> SELECT object_id FROM dba_objects WHERE object_name = 'I_T1_A';
 OBJECT_ID
----------
      76265
SQL> ALTER SESSION SET EVENTS 'immediate trace name treedump level 76265';
Session altered.

----- begin tree dump
branch: 0x100051b 16778523 (0: nrow: 2, level: 1)
   leaf: 0x100051e 16778526 (-1: nrow: 499 rrow: 499)
   leaf: 0x100051f 16778527 (0: nrow: 2 rrow: 2)
----- end tree dump

可以发现两个索引leaf node,1个有499个键值,另外一个2个键值。

3.转储数据块:

select header_file, header_block from dba_segments where segment_name='I_T1_A';

HEADER_FILE HEADER_BLOCK
----------- ------------
          4         1306

根节点块1307,根据上面leaf节点应该是1310,1311.

alter system dump datafile 4 block min 1310 block max 1311;

Start dump data blocks tsn: 4 file#:4 minblk 1310 maxblk 1311
........

Block header dump:  0x0100051f
 Object id on Block? Y
 seg/obj: 0x129e9  csc: 0x00.37946f  itc: 2  flg: E  typ: 2 - INDEX
     brn: 0  bdba: 0x1000518 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.010.00000e0d  0x00c00a13.0222.02  CB--    0  scn 0x0000.0037946f
0x02   0x0005.000.00000e0b  0x00c00a0f.0222.1c  --U-    2  fsc 0x0000.00379471
Leaf block dump
===============
header address 46978354870884=0x2aba00277a64
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y
kdxconco 1
kdxcosdc 1
kdxconro 2
kdxcofbo 40=0x28
kdxcofeo 8004=0x1f44
kdxcoavs 7964
kdxlespl 0
kdxlende 0
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 16778526=0x100051e
kdxledsz 6
kdxlebksz 8032
row#0[8018] flag: ------, lock: 2, len=14, data:(6):  01 00 05 0e 00 2e
col 0; len 5; (5):  30 30 35 30 30
row#1[8004] flag: ------, lock: 2, len=14, data:(6):  01 00 05 0e 00 2f
col 0; len 5; (5):  30 30 35 30 31
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 1310 maxblk 1311

也可以确定1311块中仅仅两个键值。

SQL> select dump('00500',16),dump('00501',16) from dual;

DUMP('00500',16)             DUMP('00501',16)
---------------------------- ----------------------------
Typ=96 Len=5: 30,30,35,30,30 Typ=96 Len=5: 30,30,35,30,31

根据测试如果index leaf node  90-10 split时,实际上是新添加的键值使用新的索引extent,保留原来节点信息。实际上应该叫100-1个键值的split。

时间: 2024-10-27 04:22:08

理解index leaf node 90-10 split的相关文章

[201112114]index leaf node 50-50 split

index leaf node  50-50 split [201112114]index leaf node  50-50 split.txt 当索引leaf满分裂时,存在两种情况:1.如果插入的键值是最大值,分裂按照90-10 split.2.如果不是,按照50-50分裂. 如何大量出现50-50的分裂呢?实际上的测试的例子很简单,如果先插入一个异常大的键值,插入键值是线性增加的,就可以模拟大量50-50的分裂然后如下: 1.建立测试表: select * from v$version;BA

Oracle索引分裂(Index Block Split)

Oracle索引分裂(Index Block Split) 索引分裂:index  block split : 就是索引块的分裂,当一次DML 事务操作修改了索引块上的数据,但是旧有的索引块没有足够的空间去容纳新修改的数据,那么将分裂出一个新的索引块,旧有块的部分数据放到新开辟的索引块上去. 分裂的类型:根节点分裂,分支节点分裂,叶节点分裂(最频繁发生,对性能影响最直接) 按照数据迁移量的比例,将索引分裂分为两种类型:9-1分裂和5-5分裂. 9-1分裂:绝大部分数据还保留在旧有节点上,仅有非常

TokuMX, MongoDB and InnoDB versus the insert benchmark with disks

I used the insert benchmark on servers that use disks in my quest to learn more about MongoDB internals. The insert benchmark is interesting for a few reasons. First while inserting a lot of data isn't something I do all of the time it is something f

数据结构 关于B树说明及插入和分裂

注意:本文是我学习的一点总结,具体的代码并没有经过调试,是通过算法导论B树中的描述写成,但是增加了关于数据的链表,而不是 如算法导论中的一个数组,留于此用于以后的继续深入学习. B树的定义和特点: B树的阶实际上就是指向子树的最大指针个数 比如2-3树阶为3,2-3-4树阶为4 B树已经不是常规的树结构,多用于文件系统管理,每个节点可以有多个指向 孩子的指针,特点如下: 1.根要么为空树,要么至少有2个子树 2.假设M阶的B树,n个指向子树的指针    则:    Ceil(M/2)<=n<=

9i index bug.txt 之2

9i index bug.txt 之2 1.接着以上的测试: SQL> SELECT object_id FROM dba_objects WHERE object_name = 'I_T1_A'; OBJECT_ID----------     45851         To then do a treedump of the index: SQL> ALTER SESSION SET EVENTS 'immediate trace name treedump level 45851';S

oracle 9i index bug?

9i index bug.txt 1.建立表以及索引SQL> select * from v$version ;BANNER----------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.8.0 - ProductionPL/SQL Release 9.2.0.8.0 - ProductionCORE    9.2.0.8.0       Produ

C# 理解泛型的学习笔记

术语表 generics:泛型 type-safe:类型安全 collection: 集合 compiler:编译器 run time:程序运行时 object: 对象 .NET library:.Net类库 value type: 值类型 box: 装箱 unbox: 拆箱 implicity: 隐式 explicity: 显式 linked list: 线性链表 node: 结点 indexer: 索引器 简介 Visual C# 2.0 的一个最受期待的(或许也是最让人畏惧)的一个特性就是

index full scan 和 index fast full scan (IFS,FFS)的不同

转自ITPUB 首先来看一下IFS,FFS能用在哪里:在一句sql中,如果我们想搜索的列都包含在索引里面的话,那么index full scan 和 index fast full scan 都可以被采用代替full table scan.比如以下语句: SQL> CREATE TABLE TEST AS SELECT * FROM dba_objects WHERE 0=1; SQL> CREATE INDEX ind_test_id ON TEST(object_id); SQL>

Sql Server 2005自定义Split函数

 要求取得字符串aa,dd,cc,rr,fff中某个位置的字符串,如果在C#或Java很容易通过Split来实现,但是在Sql Server中就没有直接提供Split这个函数. 当然,此类问题总是可以解决的. ALTER function [dbo].[core_split] ( @str varchar(100), @split char(1), @index int ) returns varchar(10) as begin declare @count int declare @s va