索引分裂造成的index contention等待事件的診斷
SQL> select event,count(*) from v$session group by event;
EVENT COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message from client 44
latch: cache buffers chains 1
rdbms ipc message 9
smon timer 1
pmon timer 1
SQL*Net message to client 1
enq: TX - index contention 665
7 rows selected.
SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 0
job_queue_processes integer 0
log_archive_max_processes integer 2
processes integer 1000
SQL> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
系統中出現了大量的索引分裂造成了系統的process連線得不到合適的釋放,導致後續連線數越來越多,最終達到了processes的值導致系統不得不需要重啟,剛開始我覺得可能是中介軟體的連線池沒有釋放導致。
透過下列指令碼
SELECT c.sid,
c.event,
a.sql_text,
a.hash_value
FROM v$sql a, v$session b, v$session_Wait c
WHERE c.wait_class <> 'Idle'
AND c.sid = b.sid
AND b.sql_hash_value = a.hash_value
order by c.event desc,a.sql_text desc
發現index contention等待都發生是下列sql語句中:
INSERT INTO ROBOTS_SUBJECTVISIT (ID,SUBJECT,BEGINTIME,ENDTIME,LINKS,BBSITEMS,NEWITEMS) VALUES (:1,:2,:3,:4,:5,:6,:7)
由於系統中併發較高導致了資料插入頻繁導致了索引分裂,該等待事件並沒有過多的buffer busy wait、latch cache buffer chain等的事件,而且系統正常情況下processes連線在200到300應該是正常連線數,看來真的是頻繁插入導致的索引分裂連線不能釋放,最後新的連線連入最終導致系統只有重啟。
可以考慮的解決方法:
1 重建index為反轉索引,這個可以有效的分散索引的鍵值,不過可能導致部分sql語句的執行計劃改變,index range scan無法執行。
2 當然可以考慮增大pctfree引數,讓空間使用較少,從而減少index分裂的競爭。
透過maclean的網站中給出了下列兩種方法:
對索引進行coalesce是合併同一個branch的leaf block,並不需要重新排序,而rebuild需要重新排序index,並且需要兩個index的空間。如果對索引rebuild也會變相的壓縮索引的空間,導致後續的insert同樣出現競爭。
Global hash index
建立全域性hash的分割槽索引是可以有效減低index contention的競爭的,該功能在10g中允許,在9i僅僅只能建立range的全域性分割槽索引。
create index pk001 on t_samp01(object_id) global partition by hash(object_id) partitions 8
這裡自己採用建立全域性分割槽hash index的方式,建立分割槽索引後再沒有出現大量的index contention等待事件。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1058612/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何診斷等待事件 enq: HW - contention事件ENQ
- 故障排除 | enq:TX - index contention等待事件ENQIndex事件
- 基於等待事件的效能診斷事件
- 等待事件快速定位診斷事件
- 等待事件效能診斷方法事件
- 基於等待事件的效能診斷(轉)事件
- latch free 等待事件的診斷語句事件
- enq: TX - index contention等待ENQIndex
- Oracle索引分裂(Index Block Split)Oracle索引IndexBloC
- 轉_診斷latch:shared pool等待事件事件
- db file async I/O submit等待事件的故障診斷MIT事件
- enq: WF - contention等待事件ENQ事件
- enq: CF - contention 等待事件ENQ事件
- enq: TS - contention 等待事件ENQ事件
- 深入淺出等待事件和效能診斷01事件
- 深入淺出等待事件和效能診斷02事件
- 深入淺出等待事件和效能診斷04事件
- 深入淺出等待事件和效能診斷05事件
- 未提交事務造成的等待事件事件
- 事務上的等待事件 —— enq: UL - contention事件ENQ
- 等待事件之enq: HW - contention事件ENQ
- enq:TM-contention事件等待ENQ事件
- 消除 enq: DX - contention 等待事件ENQ事件
- Oracle index索引塊分裂split資訊彙總OracleIndex索引
- 深入淺出等待事件和效能診斷記載03事件
- Oracle等待事件之enq: TM – contentionOracle事件ENQ
- 等待事件enq: TX - row lock contention事件ENQ
- oracle等待事件之enq: CF – contentionOracle事件ENQ
- 【等待事件】-enq: TX - row lock contention事件ENQ
- 關於insert操作造成索引葉節點分裂的驗證索引
- 索引分裂的enq索引ENQ
- ORACLE診斷事件的總結Oracle事件
- 關於enq: TX - index contention 等待的探討與測試ENQIndex
- enq: TM - contention TM 等待事件的原因及模擬ENQ事件
- MySQL使用event等待事件進行資料庫效能診斷MySql事件資料庫
- ORACLE診斷事件Oracle事件
- 診斷事件(1)事件
- 等待事件enq TX row lock contention分析事件ENQ