"enq: TX - index contention" (文檔 ID 2331575.1)

文檔內容
目標
解決方案
參考


適用於:

Oracle Database - Enterprise Edition - 版本 10.2.0.1 到 11.2.0.4 [發行版 10.2 到 11.2]
本文檔所含信息適用於所有平臺

目標

本文檔的目的是幫助診斷" enq: TX - index contention"問題

解決方案`

當運行 OLTP 系統時,當應用程序併發很高時,可能會看到與表相關的索引上的高 TX 隊列爭用。這通常發生在應用程序同時併發執行大量 INSERT 和 DELETE 時。 對於 RAC 系統,併發的 INSERT 和 DELETE 可能發生在所有的實例中。

原因是在將新行插入索引時,索引塊會分裂。操作將不得不等待模式4的 TX 鎖,直到進行索引分裂的會話完成操作。
當在索引塊中找不到需要插入新行的空間時,會話將啓動索引分裂。開始分裂之前,它將清除塊中的所有鍵,以檢查在被刪除的塊中是否有足夠的空間。

分裂操作必須做以下活動:

o          分配一個新的塊。
o          將一定百分比的行復制到新索引塊。
o          將新索引塊添加到索引結構並提交操作。

在 RAC 環境中,由於包括全局緩存操作,這可能是一項昂貴的操作。如果分裂發生在分支或根塊級別,則影響將更大。

原因:

最可能的原因是:

o 從應用程序大量訪問的表的索引。
o 單向生長的表列索引。也就是說,大多數索引插入僅在索引的右邊緣出現。
o 已執行大量數據清除,並緊接着又發生了高併發插入。

識別熱索引:

有爭用的索引可以從問題時段的 AWR 報告中確定。

Top 5 Timed Events:

Event                       Waits      Time(s)   Avg Wait(ms)  % Total Call  Time Wait Class 
en: TX - index contention   89,350     40,991    459           63.3          Concurrency 
db file sequential read     1,458,288  12,562    9             19.4          User I/O 
CPU time                               5,352                   8.3   

Instance Activity Stats:

Statistic                Total     per Second    per Trans 
branch node splits       945       0.26          0.00 
leaf node 90-10 splits   1,670     0.46          0.00 
leaf node splits         35,603    9.85          0.05  

而這些對象可以從 V$SEGMENT_STATISTICS 或從 AWR 報告中的“Segments by Row Lock Waits”或“Segments by ITL Waits”或“Service ITL Waits”中找到。

Segments by Row Lock Waits:

Owner     Tablespace  Object Name            Obj.Type   Row Lock Waits  % of Capture 
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_PK   INDEX      3,425           43.62 
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_ST   INDEX      883             11.25 
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_DT   INDEX      682             8.69 

Segments by ITL Waits

Owner   Tablespace Name Object Name     Subobject Name  Obj. Type       ITL Waits       % of Capture
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_PK                  INDEX              6       50.00
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_ST                  INDEX              3       25.00
ACSSPROD  ACSS_IDX03  ACSS_ORDER_HEADER_DT                  INDEX              3       25.00

解決方案:

這裏的解決方案是調整索引,避免對少量塊進行大量訪問。
以下是我們可以嘗試的選項:
• 將 AWR 報告的'Segments by Row Lock Waits'中列出的索引重建爲反向鍵索引或散列分區
例如:
CREATE INDEX <index name> ON <column> REVERSE;

從性能調優指南 -

反向鍵索引旨在消除插入應用程序上的索引熱點。 這些指標非常適合插入操作的性能。 但它的缺點是它可能影響索引範圍掃描的性能。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/design.htm#sthref112

在多用戶 OLTP 環境中,如果索引中的少量葉子索引塊併發很高,那麼哈希分區方法可以提高索引的性能。 在某些 OLTP 應用程序中,索引插入只發生在索引的右邊緣。 當索引定義爲單調遞增的列時,可能會發生這種情況。 在這種情況下,由於索引頁,緩衝區,更新鎖存器和附加索引維護活動的爭用,索引的右邊緣成爲熱點,從而導致性能下降。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/data_acc.htm#i2678
建議在將索引重新構建爲反向鍵索引或哈希分區後,測試應用程序的性能。
• 考慮增加 sequence 的 CACHE 大小
alter sequence <owner>.<seq name> cache <required value>;
當我們使用單調增加的 sequence 來填充列值時,具有高序列值的葉子索引塊將隨着每個插入而改變,這使得它成爲塊分裂的熱塊和潛在候選。

使用 CACHE SIZE(並且可能使用 NOORDER 選項),每個實例將使用具有不同範圍的 sequence,減少索引鍵插入同一組葉子索引塊。
• 在大量數據清除後,重建或 shrink 相關聯索引
如果有大量的數據清除(刪除)操作,通過 alter index rebuild 或 alter index shrink 命令重建或縮小關聯的索引有助於減少等待。

• 增加索引的 PCT_FREE
高的 PCT_FREE 有助於避免索引塊的 ITL 爭用。當一個區塊內的所有可用 ITL 當前正在使用中,而且 Oracle 的 PCT_FREE 區域沒有足夠的空間來動態分配新的 ITL 插槽,那麼將發生 ITL 爭用。

參考

BUG:8735005 - SLOW INSERT - POSSIBLY DUE TO INDEX BLOCK SPLIT
BUG:19023318 - INDEX BLOCK SPLIT CAN CAUSE ENQ:TX-INDEX CONTENTION

引用自:"enq: TX - index contention" (文檔 ID 2331575.1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章