Statspack之十三-Enqueue
enqueue是一種保護共享資源的鎖定機制。該鎖定機制保護共享資源,如記錄中的資料,以避免兩個人在同一時間更新 同一資料。enqueue
包括一個排隊機制,即FIFO(先進先出)排隊機制。
Enqueue等待常見的有ST、HW 、TX 、TM等
ST enqueue,用於空間管理和字典管理的表空間(DMT)的區間分配,在DMT中典型的是對於uet$和fet$資料字典表的 爭用。對於支援LMT的
版本,應該儘量使用本地管理表空間. 或者考慮手工預分配一定數量的區(Extent),減少動態擴充套件
時發生的嚴重佇列競爭。
我們通過一個例項來看一下:
DB Name DB Id Instance Inst Num Release OPS Host ------------ ----------- ------------ -------- ----------- --- ------------------ DB 40757346 aaa 1 8.1.7.4.0 NO server Snap Id Snap Time Sessions ------- ------------------ -------- Begin Snap: 2845 31-10月-03 02:10:16 46 End Snap: 2848 31-10月-03 03:40:05 46 Elapsed: 89.82 (mins) 對於一個Statspack的report,取樣時間是非常重要的維度,離開時間做參考,任何等待都不足以說明問題。 Cache Sizes ~~~~~~~~~~~ db_block_buffers: 51200 log_buffer: 2097152 db_block_size: 16384 shared_pool_size: 209715200 ……….. Top 5 Wait Events ~~~~~~~~~~~~~~~~~ Wait % Total Event Waits Time (cs) Wt Time -------------------------------------------- ------------ ------------ ------- enqueue 53,793 16,192,686 67.86 rdbms ipc message 19,999 5,927,350 24.84 pmon timer 1,754 538,797 2.26 smon timer 17 522,281 2.19 SQL*Net message from client 94,525 520,104 2.18 ------------------------------------------------------------- 在Statspack分析中,Top 5等待事件是我們最為關注的部分。 這個系統中,除了enqueue 等待事件以外,其他4個都屬於空閒等待事件,無須關注。我們來關注一下enqueue等 待事件,在89.82 (mins)的取樣間隔內,累計enqueue等待長達16,192,686cs,即45小時左右。這個等待已經太過 顯著,實際上這個系統也正因此遭遇了巨大的困難,觀察到佇列等待以後,我們就應該關注佇列等待在等待什麼 資源。快速跳轉的Statspack的其他部分,我們看到以下詳細內容: Enqueue activity for DB: DB Instance: aaa Snaps: 2716 -2718 -> ordered by waits desc, gets desc Enqueue Gets Waits ---------- ------------ ---------- ST 1,554 1,554 ------------------------------------------------------------- 我們看到主要佇列等待在等待ST鎖定,對於DMT,我們說這個等待跟FET$,UET$的爭用緊密相關。我們在回過頭來 研究捕獲的SQL語句: -> End Buffer Gets Threshold: 10000 -> Note that resources reported for PL/SQL includes the resources used by all SQL statements called within the PL/SQL code. As individual SQL statements are also reported, it is possible and valid for the summed total % to exceed 100 Buffer Gets Executions Gets per Exec % Total Hash Value --------------- ------------ -------------- ------- ------------ 4,800,073 10,268 467.5 51.0 2913840444 select length from fet$ where file#=:1 and block#=:2 and ts#=:3 803,187 10,223 78.6 8.5 528349613 delete from uet$ where ts#=:1 and segfile#=:2 and segblock#=:3 a nd ext#=:4 454,444 10,300 44.1 4.8 1839874543 select file#,block#,length from uet$ where ts#=:1 and segfile#=: 2 and segblock#=:3 and ext#=:4 23,110 10,230 2.3 0.2 3230982141 insert into fet$ (file#,block#,ts#,length) values (:1,:2,:3,:4) 21,201 347 61.1 0.2 1705880752 select file# from file$ where ts#=:1 …. 9,505 12 792.1 0.1 1714733582 select f.file#, f.block#, f.ts#, f.length from fet$ f, ts$ t whe re t.ts#=f.ts# and t.dflextpct!=0 and t.bitmapped=0 6,426 235 27.3 0.1 1877781575 delete from fet$ where file#=:1 and block#=:2 and ts#=:3 我們看到資料庫頻繁操作UET$,FET$系統表已經成為了系統的主要瓶頸。 至此,我們已經可以準確的為該系統定位問題,相應的解決方案也很容易確定,在8.1.7中,使用LMT代替DMT, 這是解決問題的根本辦法,當然實施起來還要進行綜合考慮,實際情況還要複雜得多。 |
HW enqueue指和段的高水位標記相關等待;手動分配適當區可以避免這一等待。
TX是最常見的enqueue等待。TX enqueue等待通常是以下三個問題之一產生的結果。
第一個問題是唯一索引中的重複索引,你需要執行提交(commit)/回滾(rollback)操作來釋放enqueue。
第二個問題是對同一點陣圖索引段的多次更新。因為單個點陣圖段可能包含多個行地址(rowid),所以當多個使用者試圖更新同一段時,可能一個
使用者會鎖定其他使用者請求的記錄,這時等待出現。直到獲得鎖定的使用者提交或回滾, enqueue釋放。
第三個問題,也是最可能發生的問題是多個使用者同時更新同一個塊。如果沒有足夠的ITL槽,就會發生塊級鎖定。通過增大initrans和/或
maxtrans以允許使用多個ITL槽(對於頻繁併發進行DML操作的資料表,在建表之初就應該考慮為相應引數設定合理的數值,避免系統執行
以後線上的更改,在8i之前,freelists等引數不能線上更改,設計時的考慮就尤為重要),或者增大表上的pctfree值,就可以很容易的避免
這種情況。
TM enqueue佇列鎖在進行DML操作前獲得,以阻止對正在操作的資料表進行任何DDL操作(在DML操作一個資料表時,其結構不能被更改)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8750110/viewspace-6858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle之StatspackOracle
- Statspack之四-測試安裝好的Statspack
- Statspack之九-其它重要指令碼指令碼
- Statspack之六-生成分析報告
- Statspack之七-移除定時任務
- TC ENQUEUEENQ
- Statspack之一-Statspack簡介
- Statspack之三-安裝statspack
- 【ASK_ORACLE】Row Cache Enqueue鎖之概念篇OracleENQ
- Statspack之五-規劃自動任務
- Statspack之八-刪除歷史資料
- oracle enqueue(zt)OracleENQ
- oracle enqueue typeOracleENQ
- enqueue種類ENQ
- oracle enqueue lockOracleENQ
- 【STATSPACK】Statspack安裝、測試與使用
- statspack分析
- statspack解析
- Oracle Enqueue WaitsOracleENQAI
- 上傳enqueue剖析ENQ
- 什麼是enqueueENQ
- enqueue wait event .ENQAI
- Enqueue events part oneENQ
- Enqueue events part twoENQ
- Spring Security系列之退出(十三)Spring
- 【實驗】【STATSPACK】Statspack 安裝、測試與使用
- Android高階之十三講之安全方案Android
- 【statspack安裝】
- statspack 初學
- Statspack總結
- What is the "WF - Contention'' Enqueue ?ENQ
- Enqueue 鎖定機制ENQ
- ENQUEUE總結筆記ENQ筆記
- TX ENQUEUE阻塞的理解ENQ
- Enqueue整理總結(轉)ENQ
- enqueue的種類(zt)ENQ
- 又見enqueue(TM SRX)ENQ
- spark 原始碼分析之十三 -- SerializerManager剖析Spark原始碼