当一个事务对一个索引块做DML时,由于该索引块没有空闲空间导致索引块分裂,这时其他事务正在向这个索引块做DML时就会产生等待,直到这个索引块分裂完成。
以下是发生索引分裂竞争的几种场景:
1)通常情况下分裂一个索引块是毫秒级的,如果某个会话长时间持有锁,也就是说该会话分裂索引块时间长,那么就需要查该会话的等待事件和读取的对象,很可能是在位图块中寻找一个可用的空块而消耗了更多的时间;
2)应用程序并发数大时导致了热块竞争,通常伴随着gc类的等待一起发生;
3)在RAC环境中,由于全局缓冲块和全局队列的争用,当私网传输有性能瓶颈时会发生,比如私网流量大或者传输时有丢失的情况而导致不能快速申请到空的索引块,通常伴随着gc类的等待一起发生。
明确了发生索引分裂竞争的原因后就需要检查是哪个对象发生了等待,从AWR中确认
Segments by RowLock Waits
% of Capture shows% of row lock waits for each top segment compared
with total rowlock waits for all segments captured by the Snapshot

此外,还可以从AWR中找出是哪类的分裂
Instance Activity Stats
Ordered by statistic name

本文详细解析了Oracle数据库中enq: TX - index contention等待事件,即索引分裂竞争的问题。当事务对索引块进行DML操作时,因为空间不足引发的分裂可能导致其他事务等待。常见场景包括会话长时间持有锁、高并发导致的热块竞争和RAC环境下的全局缓冲块竞争。解决方法包括定期重建索引、创建反向键索引或采用HASH分区。文章还介绍了如何通过位图块寻找空闲数据块以及位图状态对索引分裂的影响。
最低0.47元/天 解锁文章
847

被折叠的 条评论
为什么被折叠?



