[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
索引分裂是导致分裂的用户事务中调用的递归事务控制,其对资源的请求和释放都是在该递归事务中完成的。
在任何一块枝节点数据块上,有且只有一个ITL slot,这个ITL slot不是被用于用户事务(User Transaction)的,而是被用于发生分裂时的递归事务的。同样,在叶子节点上,第一ITL slot,也是用于此目的:
SQL代码
- 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:
SQL代码
- --叶子节点:
- ...
- 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相同。实际上,这就是在分裂时被“继承”下来的,而最后一个叶子节点因为还没有发生分裂,实际上也没有产生新的递归事务。
--- Fuyuncat TBC ---