索引插入通常发生在索引的右边,当在单调递增的列上定义索引时,大量且高并发的DML(先删除后插入)会导致索引不能及时的放入指定的位置,oracle内部会根据索引的实际存储情况,对索引进行叶块的分裂操作,以满足索引的维护需求,这个过程会导致该等待事件的产生。
可考虑的解决办法:
1.创建hash或REVERSE索引
可根据 AWR 报告的 'Segments by Row Lock Waits' 中列出的索引进行修改
REVERSE索引(REVERSE索引也是一种B树索引,但它物理上将按照列顺序保存的每个索引键值进行了反转。例如,索引键是20,用16进制存储这个标准B树索引键的两个字节是C1,15,那么反向索引存储的字节就是15,C1)带来的问题是影响索引范围扫描。
2.考虑增加序列的缓存大小
适用于索引使用了序列,序列属性建议设置为noorder,尤其在rac中,每个实例使用具有不同范围的序列键,能有效降低块拆分的可能性。
alter sequence <owner>.<seq name> cache <required value>;
3.大量清除数据后考虑重建或收缩索引
执行alter index rebuild 或 alter index shrink 命令有助于减少等待。
4.增加索引的PCT_FREE
较高的 PCT_FREE 将有助于避免索引块上的 ITL 争用。当一个块中的所有可用 ITL 当前都在使用中并且 PCT_FREE 区域中没有足够的空间供 Oracle 动态分配新的 ITL 插槽时,就会发生 ITL 争用。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/design.htm#sthref112
Troubleshooting 'enq: TX - index contention' Waits (Doc ID 873243.1)