当一个事务对一个索引块做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 statist