【ASK_ORACLE】由于索引分裂而产生的性能问题的解决方案

来源:这里教程网 时间:2026-03-03 17:54:31 作者:

环境信息

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;

相关推荐