天天看點

oracle資料庫enq: TX - allocate ITL entry性能診斷

朋友公司的某鐵路集團醫保系統出現性能問題業務不能正常辦理,下面是出現性能問題時的awr報告

oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷

從等待事件來看主要是出現了多處鎖競争.其中enq: TX - allocate ITL entry等待事件是由于預設情況下建立的表的INITRANS參數為1,索引的INITRANS參數值為2.當有太多的并發DML操作同時操作相同的資料塊或索引塊就會出現這個等待事件,可以通過檢視Segments by ITL Waits部分的資訊來了解出現大量并發DML操作的對象

oracle資料庫enq: TX - allocate ITL entry性能診斷

從下面的資訊可以看出消耗時間最長的語句都是資料更新操作

oracle資料庫enq: TX - allocate ITL entry性能診斷

Enq:TX – row lock contention 等待事件,主要是由于要修改的記錄已經被其它會話所持有排他鎖産生的.通過檢視Segments by Row Lock Waits資訊可以看出主要是由sys_serial表産生的.

oracle資料庫enq: TX - allocate ITL entry性能診斷

這是一個手工維護各業務表的主鍵序列的表.而不是選擇由序列生成器來生成主鍵造成的.語句為

select cur_num_no from SYS_SERIAL where serial_type=:"SYS_B_0" for update

oracle資料庫enq: TX - allocate ITL entry性能診斷

由上面的資訊可知産生enq: TX - allocate ITL entry 和Enq:TX – row lock contention等待的主要對象是:

表:

KC19

KC21

KC40

KCE1

KC24

kcd9

kcd4

索引:

PK_KC24

IDX_KC40

PK_KC19

IDX_KC21

PK_KCE1

PK_KC21

知道主要原因了就有解決方法:

對于enq: TX - allocate ITL entry等待事件對主要競争對象執行以下語句來修改INITRANS參數值:

Alter table kc19 initrans 50;

Alter table kc21 initrans 50;

Alter table kc40 initrans 50;

Alter table kce1 initrans 50;

Alter table kc24 initrans 50;

Alter table kcd9 initrans 50;

Alter table kcd4 initrans 50;

Alter table kc19 move;

Alter table kc21 move;

Alter table kc40 move;

Alter table kce1 move;

Alter table kc24 move;

Alter table kcd9 move;

Alter table kcd4 move;

Alter index pk_kc24 rebuild initrans 50 online;

Alter index idx_kc40 rebuild initrans 50 online;

Alter index pk_kc19 rebuild initrans 50 online;

Alter index idx_kc21 rebuild initrans 50 online;

Alter index pk_kce1 rebuild initrans 50 online;

Alter index pk_kc21 rebuild initrans 50 online;

對于Enq:TX – row lock contention等待事件主要是由

是以要解決這個問題需要修改各業表主鍵的生成方式不要使用上面的這種方法.

下面的圖表是在執行上面的修改操作之後下午業務高峰期的awr報告如下

oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷

現在主要的就是enq: TX – row lock contention等待的這個需要修改程式結構

下面的圖表是在執行上面的修改操作之後第二天上午業務高峰期8點到9點的awr報告如下

oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷

下面的圖表是在執行上面的修改操作之後第二天上午業務高峰期9點到10點的awr報告如下

oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷

下面的圖表是在執行上面的修改操作之後第二天上午業務高峰期10點到11點的awr報告如下

oracle資料庫enq: TX - allocate ITL entry性能診斷
oracle資料庫enq: TX - allocate ITL entry性能診斷

現在資料庫運作較好.

問題原因有以下兩個

1.由于并發更新的對象的initrans參數過小當出現大量并發插入,更新操作時出現了enq: TX - allocate ITL entry等待事件.

2.由于各業務表的主鍵序列值是由程式SYS_SERIAL表來維護的,每次生成主鍵值是都要執行

産生了Enq:TX – row lock contention等待事件

解決方法:

1.對enq: TX - allocate ITL entry等待事件對主要競争對象執行以下語句來TRANS參數值

2.是以要解決Enq:TX – row lock contention這個問題需要修改各業表主鍵的生成方式比如使用序列生成器.