索引分裂是导致分裂的用户事务中调用的递归事务控制,其对资源的请求和释放都是在该递归事务中完成的。
在任何一块枝节点数据块上,有且只有一个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.
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
...
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相同。实际上,这就是在分裂时被“继承”下来的,而最后一个叶子节点因为还没有发生分裂,实际上也没有产生新的递归事务。