enq: TX - allocate ITL entry等待事件

背景

用户TOP事件中出现enq: TX - allocate ITL entry如下

问题分析

这个问题其实很明显,表和索引的默认INITRANS值不合适,引起的事务槽分配等待,具体可以参考 Troubleshooting waits for 'enq: TX - allocate ITL entry' (文档 ID 1472175.1)
解决方式就是调整表和索引的INITRANS,有必要还需要调整pcfree值,这2个参数的作用是什么见下面的解释

(转载)
PCTFREE:
            块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能再插入到此块中

ITL
(Interested Transaction List)是Oracle数据块内部的一个组成部分,用来记录该块所有发生的事务,一个itl可以看作是一个记录,在一个时间,可以记录一个事务(包括提交或者未提交事务)。当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位
initrans:
用于对数据块的行级并行操作的控制。事务槽(ITL)的概念:事务槽在数据块头中,存储了有关事务的控制信息。
每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为1,索引的INITRANS 默认为2。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足够的自由空间)。所分配的每个事务条目需要占用块首部中的23~24 字节的存储空间。注意,对于Oracle 10g,MAXTRANS 则会忽略,所有段的MAXTRANS 都是255。
也就是说,如果某个事物锁定了这个块的数据,则会在这个地方记录事务的标识,当然那个事务要先看一下这个地方是不是已经有人占用了,如果有,则去看看那个事务是否为活动状态。如果不活动,比如已经提交或者回滚,则可以覆盖这个地方。如果活动,则需要等待(闩的作用)
所以, 如果有大量的并发访问使用的这个块,则参数不能太小,否则资源竞争将导致系统并发性能下降。 如initrans值为2,则数据库服务器在一个数据块中最多有两个并行的事务可以独立、并行的通过自己的事务槽,实现对共享数据块中的行数据的事务操作。


你可能感兴趣的:(enq: TX - allocate ITL entry等待事件)