Oracle Dba必須瞭解的Read By Other Session等待:
Oracle Dba必須瞭解的Read By Other Session等待:
微博裡寫了篇關於Buffer Busy Waits等待,這裡再介紹一種跟它很相像的一個等待Read By Other Session,這個等待在10G前就是Buffer Busy Waits等待的一種情況,10G後把這個等待從Buffer Busy Waits等待的劃分了出來。總的來說,這個等待的發生在由於:程式(我們假設程式A)需要訪問的資料塊不在記憶體裡,因此不得不把資料塊從磁碟LOAD到記憶體的過程中,另一個/些(假設程式B、C)也要讀取這個資料塊,這個時候程式A發生的等待可能是db file sequential read/db file parallel read/db file scattered read中的某一個或某幾個,而程式B、C發生的等待就是我們今天要介紹的Read By Other Session,Oracle不會讓多個程式去同時物理讀取一個資料塊LOAD入共享記憶體,只會讓第一個程式去DISK讀取,然後放入共享記憶體,這麼做也是為了保護共享記憶體。步驟大致如下:
1)Oracle計算出查詢所要請求資料塊的地址,然後根據地址+塊類計算出塊所在buffer cache的Hash Bucket Number,然後獲取到保護這個Hash Bucket的CBC Latch,在持有CBC Latch的情況下,在Hash Bucket裡尋找目標Block是否存在在Bucket裡,最終沒有找到,釋放CBC Latch。(可能Oracle 實際發生的情況與我描述的不符,看最後的解釋)。
2)申請Lru Latch,搜尋Lru-Aux連結串列找尋空閒塊。其實這個連結串列是以buffer header上的指標串起來的,buffer header上還有指向buffer block的指標,找到後,修改buffer header的某些條目,比如把block address的資訊設定上去,指向記憶體裡的某個buffer,主要是標示記憶體裡的這個塊已經被使用了。
3)再次獲取正確的CBC Latch,把這個buffer header連結到正確的hash chain上去,也就是把它放到正確的hash bucket裡去。
4)以排他的x模式去pin這個buffer。這樣別的會話就能知道這個buffer還不能訪問。
5)釋放Lru Latch,CBC Latch.
6)開始物理讀取,這個時候前臺程式等待db file sequential read/db file parallel read/db file scattered read ,具體等待那一種,看讀取的型別,也可能會出現多種等待。
7)在物理讀取期間,如果有其他會話也想訪問這個資料塊,等待Read By Other Session 。
8)讀取結束後,申請CBC Latch,unpin這個buffer,釋放CBC Latch。
10G前把這個等待歸入到了Buffer Busy Waits等待裡,這麼歸類也是有道理的:Buffer Busy Waits等待的本質是由於欲獲得buffer lock的會話由於申請的鎖模式跟buffer上已經存在的鎖模式衝突導致的。而read by other session也符合這一核心要點。物理讀取資料塊的程式在對應的buffer上加了x模式的buffer lock,其他程式想要以s模式讀取資料塊,由於x模式的buffer lock,與任何其他鎖模式都不相容,因此產生了read by other session等待,也就是10G前的buffer busy waits等待中的一種情形。直接路徑讀取會不會產生read by other session?不會的,直接路徑讀取把資料讀取在程式自己的PGA裡,不涉及到共享記憶體的佔用,這種情況下,即使有併發,各個程式間的等待也只是direct path read。步驟1我的描述裡,程式在發現資料塊不在記憶體後,釋放了CBC Latch,然後去申請Lru Latch,獲得空閒記憶體塊後,再次去持有CBC Latch,而這個過程也非常可能是程式在發現資料塊不在記憶體後,不釋放CBC Latch,直接去持有Lru Latch。至於到底是哪個過程,我就不做驗證了,有興趣的可以去手工的持有latch驗證下。我個人覺得不釋放CBC Latch,直接去持有Lru Latch的可能性比較大:1)這樣省去了釋放CBC Latch最後又獲得一次CBC Latch的資源消耗 2)Lru的Latch的級別設計的比CBC Latch級別高,因此在持有CBC Latch的情況下再去持有Lru Latch更顯得順理成章。當然這個只是我YY,理論上持有Lru Latch情況下,以immediate 方式去申請CBC Latch也是可以的。這裡只是給大家大體介紹一下這個等待的一些基本情況,更深的細節暫時就不過多研究了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-739470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- read by other session等待事件Session事件
- 【TUNE_ORACLE】等待事件之IO等待“read by other session”Oracle事件Session
- read by other session 等待事件分析Session事件
- ORACLE DBA必須記住的常用SQL命令和檢視OracleSQL
- 你必須瞭解Spring的生態Spring
- 【TUNE_ORACLE】等待事件之IO等待“direct path read”Oracle事件
- 有關WebSocket必須瞭解的知識Web
- 【TUNE_ORACLE】等待事件之IO等待“db file scattered read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file sequential read”Oracle事件
- 你必須瞭解的「架構」小歷史架構
- 你必須瞭解的分散式事務解決方案分散式
- oracle 會話(session)被鎖瞭解決方法Oracle會話Session
- 2019年你必須瞭解的乾貨集錦
- 你必須瞭解的大資料分析軟體大資料
- 『JWT』,你必須瞭解的認證登入方案JWT
- 中高階前端必須瞭解的--陣列亂序前端陣列
- 關於Web前端,你必須瞭解的發展方向Web前端
- 50個你必須瞭解的Kubernetes面試問題面試
- Spark Streaming精進之前必須瞭解的基本概念Spark
- 釋出新聞稿必須瞭解的幾個問題
- direct path read/read temp等待事件事件
- Java 異常你必須瞭解的一些知識Java
- Web前端開發工程師必須瞭解的HTTP知識Web前端工程師HTTP
- 企業使用ERP系統必須瞭解的注意事項
- 你必須瞭解的10款伺服器監控工具伺服器
- 在深入 Web 開發之前您必須瞭解的事項Web
- 專案文件管理利器:2024年你必須瞭解的工具
- Java 開發, volatile 你必須瞭解一下Java
- 你必須瞭解的反射——反射來實現實體驗證反射
- 關於機器學習你必須瞭解的十個真相機器學習
- 關於校園招聘你必須瞭解的五件事
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- 人生苦短,瞭解一下前端必須明白的http知識點前端HTTP
- 13個網路管理員必須瞭解的網路監控工具
- 你必須瞭解的java記憶體管理機制(四)-垃圾回收Java記憶體
- 企業擁抱開源之前,必須瞭解的七件事
- 聊聊開始資料治理前必須瞭解的四個內容
- 必須瞭解的mysql三大日誌-binlog、redo log和undo logMySql
- 你必須瞭解的微服務架構設計的10個要點!微服務架構