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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章