特定的閂鎖和互斥場景
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效能優化求生指南》
庫快取是共享池的一部分,在共享池裡有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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試官:你說說互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂觀鎖的應用場景面試
- [淺析]特定場景下取代if-else和switch的方案
- tempdb大量閂鎖等待問題分析
- Go語言中的互斥鎖和讀寫鎖(Mutex和RWMutex)GoMutex
- Python中的互斥鎖Python
- 小議“悲觀鎖和樂觀鎖”的原理、場景、示例
- 執行緒安全: 互斥鎖和自旋鎖(10種)執行緒
- 【go】golang中鎖的用法-互斥鎖Golang
- 執行緒同步與互斥:互斥鎖執行緒
- 執行緒的互斥鎖執行緒
- liteos互斥鎖(七)
- 讀寫鎖 ReentrantReadWriteLock 與 互斥鎖 的效率
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- C 語言的 互斥鎖、自旋鎖、原子操作
- Go語言的互斥鎖MutexGoMutex
- 閉鎖和柵欄的區分以及適用場景
- 非常規 - VUE 實現特定場景的主題切換Vue
- 互斥鎖mutex的簡單實現Mutex
- 透過互斥鎖+條件量的方式實現同步與互斥
- 互斥鎖和訊號量有什麼不同?(譯)
- 經典問題之樂觀鎖和悲觀鎖及使用場景
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- ZooKeeper 分散式鎖 Curator 原始碼 04:分散式訊號量和互斥鎖分散式原始碼
- 悲觀的併發策略——synchronized互斥鎖synchronized
- MySQL死鎖系列-常見加鎖場景分析MySql
- 【分散式鎖的演化】“超賣場景”,MySQL分散式鎖篇分散式MySql
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等...Java
- python 協程 自定義互斥鎖Python
- Linux之執行緒互斥鎖Linux執行緒
- Jtti:linux下訊號量和互斥鎖有哪些區別?JttiLinux
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- Go 互斥鎖 Mutex 原始碼分析(二)GoMutex原始碼
- [譯] part25: golang Mutex互斥鎖GolangMutex
- Golang 讀寫鎖RWMutex 互斥鎖Mutex 原始碼詳解GolangMutex原始碼
- Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等Java
- Go 語言的原子操作和互斥鎖的區別Go
- ObjC 多執行緒簡析(二)- os_unfair_lock的型別和自旋鎖與互斥鎖的比較OBJ執行緒AI型別
- Go 標準庫 —— sync.Mutex 互斥鎖GoMutex