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