【ASK_ORACLE】由於索引分裂而產生的效能問題的解決方案

Attack_on_Jager發表於2022-09-26

環境資訊

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;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2916300/,如需轉載,請註明出處,否則將追究法律責任。

相關文章