ITL争用

itl争用
所有事务在修改块之前,必须在块头的ITL上登记条目。当在块头上请求登记itl条目时,如果数据块上没有足够的ITL槽(slot),itl tx等待会发生。

影响itl的因素
initrans  初始分配的itl条目数
maxtrans  最大itl条目数(10g不能更改,为255)。
pctfree   空闲空间所占块比例,虽然pctfree预留了空间,但是update操作可能会将其占用,导致块空间不足,以致可能没有空间分配itl条目。


SQL> create table itl_test(id int,text varchar2(100)) pctfree 0;

表已创建。

SQL> begin
  2     for i in 1..10000 loop
  3        insert into itl_test values(i,'hello world!');
  4     end loop;
  5     commit;
  6  end;
  7  /

PL/SQL 过程已成功完成。

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) bno from itl_test wh
ere rownum < 5000 order by fno,bno;

       FNO        BNO
---------- ----------
         4        468
         4        469
         4        470
         4        471
         4        472
         4        473
         4        474
         4        475
         4        476
         4        477
         4        478

       FNO        BNO
---------- ----------
         4        479
         4        480
         4        482

已选择14行。

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) bno from itl_test wh
ere id between 4900 and 5000 order by fno,bno;

       FNO        BNO
---------- ----------
         4        485

SQL> update itl_test set text='hi,morning!' where id=4901
  2  ;

已更新 1 行。


--session2
SQL> update itl_test set text='hi,morning!' where id=4902;
 
1 row updated

--session3
SQL> update itl_test set text='hi,morning!' where id=4903; --出现了等待

在session1中查询等待事件

SQL> SELECT t.EVENT,t.SID FROM v$session t where t.EVENT LIKE '%ITL%';
 
EVENT                                                                   SID
---------------------------------------------------------------- ----------
enq: TX - allocate ITL entry                                            147

由于pctfree为0,块中没有足够的空间分配ITL,才出现ITL等待,当session1事务提交后,等待消失,也就是 当事务提交之后,才能重用ITL
 
查看表itl_test的ddl
PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
可知, INITRANS默认为1,而dump出来的trace文件中显示了两条itl条目,MAXTRANS默认为255。


将块485 dump:

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0007.006.00000222  0x0080b62e.030e.0a  C---    0  scn 0x0000.002367a8
0x02   0x0004.00a.00000227  0x008003bc.015c.05  ----    1  fsc 0x0001.00000000
.
.
.
.
fsbo=0x2f0
fseo=0x2f3
avsp=0x2

从dump的trace文件中可以看出有 两个itl条目(Itl),并且该块已经没有空间,虽然没有达到MAXTRANS,不能再分配itl条目。

所以对于事务频繁的表,创建表时应设置较高的INITRANS,以解决itl争用问题。对于发生了行迁移与行链接的行,更新一行时,对多个块都要分配itl条目,因此发生itl条目不足引起的itl争用现象的概率会增加。
如果是应用造成的itl争用,只能修改应用。


参考:

http://blog.csdn.net/robinson1988/article/details/4721605



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值