环境信息
OS:RHEL 6.10
Grid&DB:Oracle 11.2.0.4 问题描述接到开发反馈夜间跑批业务非常缓慢,需要协助排查。抓取AWR报告发现,在“Top 5 Timed Events”这一栏里首当其冲的等待事件就是“enq: TX - index contention”,第一反应就是大量高并发的DML操作导致了索引分裂产生的性能问题(幸亏这个库不是RAC,不然情况更严重)。 注:索引分裂的知识点可参考:关于Oracle索引分裂你需要知道的: http://blog.itpub.net/69992972/viewspace-2916305/ 接着找到发生分裂的索引:
Segments by Row Lock Waits: Owner Tablespace Object Name Obj.Type Row Lock Waits % of Capture PLIS PLIS pl_status_idx INDEX 6,981 92.07 PLIS PLIS pl_pos_idx INDEX 1,557 23.91 PLIS PLIS pl_zt_idx INDEX 976 15.56
注:也可以在动态性能视图v$segment_statistics里查到 解决办法由于索引分裂是由于索引块的竞争压力过大,产生了索引热块,有两种解决办法来减少索引热块: 1. 创建hash分区索引 2. 创建反向索引由于跑批的表不是分区表,所以采用第二种方式,把上面的三个索引删除并重建:
create index pl_status_idx on xxx.xxx REVERSE; create index pl_pos_idx on xxx.xxx REVERSE; create index pl_zt_idx on xxx.xxx REVERSE;
注:另外一种方法也可以尝试,如果此时的delete操作已经结束,可以rebuild或者shrink索引,语法如下:
alter index pl_status_idx rebuild; alter index pl_status_idx shrink space;
