技术开发 频道

B-Tree 索引中的数据块分裂

  索引分裂是导致分裂的用户事务中调用的递归事务控制,其对资源的请求和释放都是在该递归事务中完成的。

  在任何一块枝节点数据块上,有且只有一个ITL slot,这个ITL slot不是被用于用户事务(User Transaction)的,而是被用于发生分裂时的递归事务的。同样,在叶子节点上,第一ITL slot,也是用于此目的:

HELLODBA.COM> truncate table idx_split;

  
Table truncated.

  HELLODBA.COM
> conn demo/demo

  Connected.

  HELLODBA.COM
> alter session set events '10224 trace name context forever,level 1';

  Session altered.

  HELLODBA.COM
> begin

  
2 for i in 1..100

  
3 loop

  
4 insert into idx_split (a, b, c) values (i*3, lpad('A', 100, 'A'), sysdate);

  
5 end loop;

  
6 end;

  
7 /

  PL
/SQL procedure successfully completed.

  HELLODBA.COM
> alter session set events 'immediate trace name treedump level 199127';

  Session altered.

  HELLODBA.COM
> alter system dump datafile 15 block min 1035 block max 1039;

  System altered.

  HELLODBA.COM
> conn demo/demo

  Connected.

  HELLODBA.COM
> alter system dump datafile 15 block 1029;

  System altered.

  我们将叶子节点和枝节点Dump出来,可以看到叶子节点的第一条ITL slot和枝节点的ITL slot不同于用户事务(叶子节点上第二条)的ITL slot:

 --叶子节点:

  ...

  Itl Xid Uba Flag Lck Scn
/Fsc

  
0x01 0x00ab.022.00000207 0x0082ee89.00ab.05 -BU- 1 fsc 0x0000.b1859b20

  
0x02 0x00ab.001.00000205 0x00812f10.00aa.20 ---- 15 fsc 0x0000.00000000

  ...

  Itl Xid Uba Flag Lck Scn
/Fsc

  
0x01 0x00ab.008.00000208 0x0082ee89.00ab.09 -BU- 1 fsc 0x0000.b1859b22

  
0x02 0x00ab.001.00000205 0x0082ee8a.00ab.02 ---- 15 fsc 0x0000.00000000

  ...

  Itl Xid Uba Flag Lck Scn
/Fsc

  
0x01 0x00ab.008.00000208 0x0082ee89.00ab.0a CB-- 0 scn 0x0000.b1859b22

  
0x02 0x00ab.001.00000205 0x0082ee8a.00ab.16 ---- 10 fsc 0x0000.00000000

  
--枝节点:

  Itl Xid Uba Flag Lck Scn
/Fsc

  
0x01 0x00ab.008.00000208 0x0082ee89.00ab.0b C--- 0 scn 0x0000.b1859b22

  注意:也许你注意到了上述例子中,最后2个叶子节点的递归事务ITL与枝节点的递归事务ITL相同。实际上,这就是在分裂时被“继承”下来的,而最后一个叶子节点因为还没有发生分裂,实际上也没有产生新的递归事务。

0
相关文章