关于enq: TX - allocate ITL entry的问题分析

今天发现系统在下午1点左右的时候负载比较高,就抓取了一个最新的awr报告.

Snap Id Snap Time Sessions Cursors/Session
Begin Snap: 20892 26-Nov-14 13:20:17 3623 5.4
End Snap: 20893 26-Nov-14 13:30:17 3602 5.4
Elapsed:   10.01 (mins)    
DB Time:   365.56 (mins)    

来看看是否有top的等待事件,对于其它的几个等待事件都很熟悉了。有些问题早已进行了建议,还在修改中,但是对于第3个等待事件"enq: TX - allocate ITL entry"还是比较陌生的。准备来做一个深入的分析。

Event Waits Time(s) Avg wait (ms) % DB time Wait Class
DB CPU   7,322   33.38  
db file sequential read 3,833,628 5,031 1 22.94 User I/O
enq: TX - allocate ITL entry 187 3,607 19287 16.44 Configuration
direct path read temp 1,017,363 1,640 2 7.48 User I/O
read by other session 3,873,525 1,612 0 7.35 User I/O

因为得到的是最新的awr报告。所以就在sqllplus上简单排查了一把。可以看到有两个session都持有这个等待事件。
SQL>    select EVENT,sid,serial# from v$session where event='enq: TX - allocate ITL entry';
EVENT                                                                   SID    SERIAL#
---------------------------------------------------------------- ---------- ----------
enq: TX - allocate ITL entry                                           5592      25063
enq: TX - allocate ITL entry                                          11533      51179

查看一下session的明细信息。可以看到这个session都是来自同一个客户端。

       SID    SERIAL# USERNAME        OSUSER          MACHINE              PROCESS         TERMINAL        TYPE       LOGIN_TIME
---------- ---------- --------------- --------------- -------------------- --------------- --------------- ---------- -------------------
       5592      25063   APPC         pappwrk01         prod_client_db              1234            unknown         USER       2014-11-26 13:03:45
     11533      51179   APPC          pappwrk01        prod_client_db              1234            unknown         USER       2014-11-26 13:03:46

查看这个session正在执行的sql语句,发现都是对同一个表的update。语句类似
UPDATE DIRECT_DEBIT_REQUEST SET DIRECT_DEBIT_REQUEST.ACCOUNT_ID=..........

到这个地方,问题似乎很清晰了,就是由于表DIRECT_DEBIT_REQUEST的ITL的设置不能够满足并发事务的需求而导致的等待。数据块是oracle能够发出的最小I/O单位。在数据块中,数据块头部的ITL信息是至关重要的。
每当一个事务需要修改一个数据块时,需要在数据块头部获得一个可用的ITL槽,其中记录了当前事务的id,使用的undo数据块地址,还有对应的scn,事务是否提交等信息。如果一个新的事务发现ITL槽已经被使用,会重新
申请一个新的ITL槽,这个过程是动态的,进一步来说,ITL槽的设置是由ini_trans,max_trans来决定的,在10g之后,max_trans参数被忽略了。
SQL> create table trans_test(id number,name varchar2(100)) initrans 1 maxtrans 1;
Table created.

SQL> set linesize  100
SQL> col table_name format a30
SQL> select ini_trans,max_trans,table_name from user_tables where table_name='TRANS_TEST';
 INI_TRANS  MAX_TRANS TABLE_NAME
---------- ---------- ------------------------------
         1        255 TRANS_TEST

关于这个参数的解释在oracle sql reference中有详细的解释。

MAXTRANS Parameter

In earlier releases, the MAXTRANS parameter determined the maximum number of concurrent update transactions allowed for each data block in the segment. This parameter has been deprecated. Oracle now automatically allows up to 255 concurrent update transactions for any data block, depending on the available space in the block.

Existing objects for which a value of MAXTRANS has already been set retain that setting. However, if you attempt to change the value for MAXTRANS, Oracle ignores the new specification and substitutes the value 255 without returning an error.

对于initrans,maxtrans的默认值,表级为1,索引级为2.  一般来说不需要做特别的设置。可以根据业务的需要来配置。
来继续回到awr报告。可以在"Segments by ITL Waits"里面得到一个全面的信息。

Owner Tablespace Name Object Name Subobject Name Obj. Type ITL Waits % of Capture
APPO INDXH01 MST_LOG_1IX I2 INDEX PARTITION 12 66.67
APPO DATAS01 DIRECT_DEBIT_REQUEST   TABLE 3 16.67
APPO INDXS01 PAYMENT_2IX A23_B2 INDEX PARTITION 1 5.56
APPO INDXH01 ACTIVITY_HISTORY_1IX C90 INDEX PARTITION 1 5.56
SYS SYSAUX WRH$_SQL_PLAN_PK   INDEX 1 5.56

从上面的列表我们可以清晰的看到对于ITL wait的情况,可以说明两点。
首先是我们在发现问题的时候,可能有些操作已经结束了,我们分析的结果不一定是最全面的信息。就如我们上面所做的分析。定位到问题的是表DIRECT_DEBIT_REQUEST,其实在问题时间段内,一个大的分区索引占用了高达
67%左右的ITL wait。
其次是我们通过awr报告得到了一些详细的信息。但是还是不能够对问题做最终的结论,不能头痛医头,脚痛医脚,如果能够以点带面来排查问题,可能最后的效率要高很多。

对于这个等待事件,处理的思路在metalink上也给出了详尽的解释。可以参见

Troubleshooting waits for 'enq: TX - allocate ITL entry' (Doc ID 1472175.1) To Bottom

解决思路有3种

Increase INITRANS

A)

1) Depending on the number of transactions in the table we need to alter the value of INITRANS. here it has been changed to 50:

alter table
2) Then re-organize the table using move (alter table move;)

3) Then rebuild all the indexes of this table as below

alter index rebuild INITRANS 50;

 

Increase PCTFREE

If the issue is not resolved by increasing INITRANS then try increasing PCTFREE. Increasing PCTFREE holds more space back and so spreads the same number of rows over more blocks. This means that there are more ITL slots available overall :
B)

1) Spreading rows into more number of blocks will also helps to reduce this wait event.

alter table
2) Then re-organize the table using move (alter table service_T move;)

3) Rebuild index

alter index index_name  rebuild PCTFREE 40;

 

A Combination of increasing both INITRANS and PCTFREE

1) Set INITRANS to 50  pct_free to 40

alter table PCTFREE 40  INITRANS 50;

2) Re-organize the table using move (alter table move;)

3) Then rebuild all the indexes of the table as below

alter index  rebuild PCTFREE 40 INITRANS 50;

                             
在这个基础上更近一步,我查找产品部的文档,发现在项目开始已经对initrans的设置做了建议,但是对于这个问题,不知道什么原因最后给漏掉了。这样下来需要对一些重要的表都需要做initrans的改动。本来从awr报告中得到的
的信息显示4个对象(表&索引)可能存在initrans设置不足的情况,如果结合项目的情况来看,需要做的变更可能就是上百个对象。需要好好评估。
以下的标准可以参考以下。
对于大表,数据千万级以上的表,initrans建议设置为8~16
对于中级表,数据量在百万到千万级,initrans建议设置为4~8
对于普通的表,initrans建议设置为1~4

阅读(24697) | 评论(1) | 转发(4) |

0

上一篇:关于interval partitioning

下一篇:跨网络拷贝文件的简单实践

相关热门文章

  • ORACLE 变异表解决方法
  • ORA-00600错误分析
  • 初识ORACLE的审计功能
  • Oracle的OLEDB
  • 学ORACLE随笔

给主人留下些什么吧!~~

jeanron1002014-11-27 14:56:26

对于有些朋友的反馈,说对于initrans的设置需要机遇并发数来判定,这个没有问题,根据表的segment size来划分也是一种思路,不是绝对。

回复 | 举报

评论热议

请登录后评论。

登录 注册

盛拓传媒简介 | 关于IT168 | 合作伙伴 | 广告服务 | 使用条款 | 投稿指南 | 诚聘精英 | 联系我们 | 苹果论坛 | 网站导航 | 往日回顾

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员 测绘资质证书(乙测资字11005067) 网络文化经营许可证

感谢所有关心和支持过ITPUB的朋友们

时间: 2024-09-29 20:58:24

关于enq: TX - allocate ITL entry的问题分析的相关文章

[20150721]enq TX - allocate ITL entry

[20150721]enq TX - allocate ITL entry.txt --昨天我做了一个测试链接: http://blog.itpub.net/267265/viewspace-1742243/ --本想通过这个例子说明为什么8K数据块Hakan Factor=736? --晚上我想到一种这种特殊的表会不会产生enq TX - allocate ITL entry,也就是itl不足的情况. 1.建立测试环境: SCOTT@test> @ &r/ver1 PORT_STRING 

【MOS】 Troubleshooting waits for enq: TX - allocate ITL entry(1472175.1)

Troubleshooting waits for 'enq: TX - allocate ITL entry' (文档 ID 1472175.1) In this Document Symptoms Cause Solution   Increase INITRANS   Increase PCTFREE   A Combination of increasing both INITRANS and PCTFREE References APPLIES TO: Oracle Database

oracle数据库enq: TX - allocate ITL entry性能诊断

朋友公司的某铁路集团医保系统出现性能问题业务不能正常办理,下面是出现性能问题时的awr报告 从等待事件来看主要是出现了多处锁竞争.其中enq: TX - allocate ITL entry等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作同时操作相同的数据块或索引块就会出现这个等待事件,可以通过查看Segments by ITL Waits部分的信息来了解出现大量并发DML操作的对象 从下面的信息可以看出消耗时间最长的语句都是

【故障处理】队列等待之TX - allocate ITL entry案例

[故障处理]队列等待之TX - allocate ITL entry案例 1  BLOG文档结构图       2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① enq: TX - allocate ITL entry等待事件的解决 ② 一般等待事件的解决办法 ③ 队列等待的基本知识 Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(ht

[20140130]关于enq TX-allocate ITL entry

  昨天遇到一例enq TX - allocate ITL entry等待事件,就是维护人员打开多个会话更新一个表的某个字段,开始以为等待与undo有关,查 看才发现是"enq TX - allocate ITL entry",因为没有业务操作,建议修改为ctas来建立新表,建立相关索引,然后改名完成操作. 实际上,一般正常的业务操作,很少遇到这个等待事件,如果出现一般是pctfree设置太小或者由于记录程度增大,导致pctfree减少,以及块 上事务太多而导致问题. 做一个简单的比喻

ORACLE 归档空间满导致的enq: TX - row lock contention

  2016年10月10日,客户一预警系统发生会话数飙高,系统响应极慢,后来确诊根源是归档空间满,引起所有redo耗尽,导致会话堆积,下面是处理过程.  操作系统:HP-UX B.11.31 U ia64  数据库版本:ORACLE 10.2.0.5 RAC  按照常规处理思路,首先查看RAC数据库的告警日志:  实例1的告警日志 Mon Oct 10 19:24:48 EAT 2016 ORACLE Instance orcl1 - Can not allocate log, archival

ORACLE等待事件:enq: TX - row lock contention

enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO).enq: TX - row lock contention等待事件,OACLE将其归类为application级别的等待事件.有些场景是因为应用逻辑设计不合理造成的.下面我们看看enq: TX - row lock contention的英文介绍: This wait indicates ti

ORACLE AWR结合ASH诊断分析enq: TX - row lock contention

  公司用户反馈一系统在14:00~15:00(2016-08-16)这个时间段反应比较慢,于是生成了这个时间段的AWR报告,   如上所示,通过Elapsed Time和DB Time对比分析,可以看出在这段时间内服务器并不繁忙.分析Top 5 Timed Events,我们可以看到前五的等待事件     可以看到等待事件enq: TX - row lock contention占了所有等待事件17.3%的比例,猜测有可能是锁等待(enqueue等待)引起的阻塞导致,但是这个还不能下定论,因为

20161208理解enq TX - row lock contention

[20161208]理解enq TX - row lock contention.txt >SELECT * FROM v$event_name WHERE name = 'enq: TX - row lock contention'; EVENT#   EVENT_ID NAME                          PARAMETER1  PARAMETER2      PARAMETER3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS ------