特定的閂鎖和互斥場景

abstractcyj發表於2015-05-19
1. Library Cache Mutex等待
  庫快取是共享池的一部分,在共享池裡有SQL的快取定義、PL/SQL和JAVA類。對庫快取的修改收到library cache mutex的保護。在Oracle 10gR2之前,它們被library cache latch保護。
 用獨佔模式獲取一個library cache mutex最常見的原因是向快取中新增一個新條目。比如,在我們分析一個新的SQL語句時這將發生。Oracle在快取中查詢一個匹配的條目且沒有發現(未命中)時,它獲得相關的互斥並且插入一個新的條目。最常見的未命中型別是針對新的SQL語句,儘管也可能涉及PL/SQL塊。
 在大部分的案例中,library cache mutex之所以爭用是因為應用程式沒有使用繫結變數因而產生過度的硬解析。
 當應用程式使用字面變數而不是繫結變數時,幾乎每條SQL語句的執行都會要求一次新的SQL解析。因此,每個SQL的執行都要求得到一個互斥,互斥爭用幾乎無法避免。這通常表現為library cache: mutex事件上的高等待。
2. Library cache pin
 library cache pin嚴格來說不是一個閂鎖或互斥,但是經常在相似的場合出現。只要庫快取中的物件被解析或者重新解析,都需要獲得
library cache pin。比如,一個SQL語句的執行計劃需要被改變或者一個PL/SQL包被修改或重新編譯,library cache pin將會發生。
想要修改物件的會話將試圖以獨佔模式得到library cache pin,執行物件的會話將持有一個共享的library cache pin。
Library cache pin等待經常是由於會話試圖修改或者編譯一個PL/SQL程式,而這個程式同時正被另外一個會話執行導致的。

3. Shared Pool Latch
  Shared pool latch的主要目的是控制對共享池記憶體對映的的訪問。在共享池中,為新的SQL語句或PL/SQL包尋找空閒空間的會話需要得到shared pool latch,
 而且許多Oracle內部操作(例如重設共享池大小)也需要獲得這些閂鎖。
  過度的硬解析(library cache mutex爭用的主要原因)通常也會導致shared pool latch爭用,因為一次性的SQL語句的持續分配會導致共享池的碎片和對老的SQL
 語句持續回收。
  Shared pool latch爭用經常是高的硬解析速率產生的負面影響,並且也指示使用繫結變數或者調整CURSOR_SHARING引數的必要性。
  共享池碎片有其他的副作用,包括ORA-04031錯誤和過度的共享池記憶體消耗。多年來,我們已經看到了減輕碎片使用的各種各樣的技巧。
  a. 一些站點定期使用alter system flush shared pool命令重新整理共享池。
  b. 使用自動SGA記憶體管理可能會加重碎片問題,因為記憶體管理演算法不能總是預測或度量產生的碎片程度。轉換到手動記憶體管理可以緩解這個問題。
  c. 通過阻止大物件換進和換出記憶體,使用DBMS_SHARED_POOL在共享池中釘住大的但不頻繁地執行的PL/SQL包可能幫助減少碎片。

 4. Cache Buffers Chains Latch
  當會話需要從緩衝區告訴訪問一個塊時,它必須獲得控制緩衝的緩衝鏈上的cache buffers閂鎖。鏈是雜湊到一個共同值的少量的塊。每個cache buffers chains閂鎖
  保護許多鏈。
  訪問記憶體中的一個塊所消耗的時間數量是很小的,而且有大量的cache buffers chains閂鎖。不過,在具有高的邏輯讀的系統上,cache buffers chains閂鎖
  爭用可能會很多,特別是當邏輯讀集中在少量的塊上時。
  具有諷刺意味的是,在所有其他地方几乎完美優化的系統上,cache buffers chains閂鎖爭用也經常發生。為了得到必要的高的邏輯讀速率而誘發了cache buffers chains爭用,
  通常系統需要最小化其他形式的爭用和等待,如IO、解析和鎖等。
  然而,高的邏輯讀速率和由此產生的cache buffers chains閂鎖爭用可能是未調優SQL的結果。例如,一個使用沒有選擇性的索引的巢狀迴圈聯結多次重複的
  掃描內部表上的相同資料塊集。然後這些塊變為熱點,並且成了閂鎖爭用的物件。通過建立一個更高選擇性的索引來調優SQL將減少多餘的邏輯讀並降低閂鎖爭用,
  以及提高涉及的SQL的效能。
  Cache buffers chains閂鎖爭用與高的邏輯讀速率有關,邏輯讀集中在相對少的幾個塊上。通過調優SQL來減少邏輯讀速率是減少閂鎖爭用的一個明智的第一步。
為了減少cache buffers chains閂鎖爭用,嘗試改變索引的選項、把涉及的物件分割槽或者通過調優針對物件的SQL來減少針對熱點物件的邏輯讀。



摘自:《Oracle效能優化求生指南》

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

相關文章