Oracle Buffer Pool內部閂鎖機制

来源:http://www.cnblogs.com/leohahah/archive/2017/06/17/7039889.html
-Advertisement-
Play Games

本文中根塊,枝塊,葉塊,表塊分別是索引根塊,索引枝塊,索引葉塊,數據表塊的簡稱。 此外本文大多數觀點來自於大師呂海波《Oracle內核技術揭秘》一書,本博文為個人感想。 首先需要明確4點關於CBC LATCH和BUFFER PIN的知識點: 1. 對於根塊和枝塊,CBC LATCH都是以S模式獲取的 ...


本文中根塊,枝塊,葉塊,表塊分別是索引根塊,索引枝塊,索引葉塊,數據表塊的簡稱。 此外本文大多數觀點來自於大師呂海波《Oracle內核技術揭秘》一書,本博文為個人感想。   首先需要明確4點關於CBC LATCH和BUFFER PIN的知識點: 1. 對於根塊和枝塊,CBC LATCH都是以S模式獲取的,無BUFFER PIN 2. 對於葉塊,CBC LATCH是以X模式獲取的,BUFFER PIN是以S模式獲取的 3. 對於表塊,CBC LATCH是以X模式獲取的,SELECT語句的BUFFER PIN是以S模式獲取的,DML語句的BUFFER PIN是以X模式獲取的 4. 以上三點基本正確,但有一個特殊情況,INDEX UNIQUE SCAN的情況下是這樣的: 1)對於根塊、枝塊、葉塊,CBC LATCH都是以S模式獲取的,且都無BUFFER PIN 2)對於表塊,SELECT語句的CBC LATCH是以S模式獲取的,無BUFFER PIN;DML語句的CBC LATCH是以X模式獲取的,BUFFER PIN是以X模式獲取的   現在我們考慮一種最複雜的情況:不走索引唯一掃描但走索引的情況。 此時將CBC LATCH和BUFFER PIN的獲取方式進行分類總結: A 根塊和枝塊:以S模式獲取CBC LATCH-->>讀取索引數據-->>釋放CBC LATCH B 葉塊:以X模式獲取CBC LATCH-->>以S模式獲取BUFFER PIN,釋放CBC LATCH,讀取索引數據-->>以X模式獲取CBC LATCH,釋放BUFFER PIN-->>釋放CBC LATCH C 表塊(SELECT):以X模式獲取CBC LATCH-->>以S模式獲取BUFFER PIN,釋放CBC LATCH,讀取數據-->>以X模式獲取CBC LATCH,釋放BUFFER PIN-->>釋放CBC LATCH D 表塊(DML):以X模式獲取CBC LATCH-->>以X模式獲取BUFFER PIN,釋放CBC LATCH,修改數據-->>以X模式獲取CBC LATCH,釋放BUFFER PIN-->>釋放CBC LATCH 那麼對於SELECT和DML語句我們就可以使用以上組合來顯示出其獲取內部鎖和閂的過程: 1.SELECT語句的流程是:ABC 2.DML語句的流程是:ABD 現在我們模擬所有情況下的內部閂鎖爭用:(我們假設最差的情況,SELECT和DML語句都走同樣的索引,查同樣的數據) 一:SELECT語句的併發,即ABC併發ABC A階段全是S模式不會有爭用發生,BC階段獲取X模式CBC LATCH的時間極短(只為修改BUFFER PIN的狀態),BC階段的BUFFER PIN是S模式,也不會引發爭用。(10G之前會) 因此SELECT併發不會引發BUFFER BUSY WAITS 二:SELECT語句和DML語句的併發,即ABC併發ABD A階段全是S模式不會有爭用發生,B階段獲取X模式CBC LATCH的時間極短(只為修改BUFFER PIN的狀態),也不會發生爭用,那麼C和D階段: 如果C在前那麼D貌似會發生等待,但其實會進行構造CR塊的操作,併在獨占CBC LATCH的保護下將當前BUFFER HEADER(簡稱BH)修改為CR塊,克隆出來的塊的BH修改為XCUR的當前塊,不會發生等待。但是如果構造完CR塊完此時又有一個C或D併發過來,由於克隆塊是XCUR塊上邊被加了X模式的BUFFER PIN,那麼就會發生等待,這裡就是BUFFER BUSY WAITS啦。 如果D在前,那麼同樣的BUFFER BUSY WAITS出現,所以說只要在D之後併發了C或者D,都會造成BUFFER BUSY WAITS。 之前在此處有些疑問,為何後來的C併發不會發生一致性讀呢,後來想想D已經加了X模式的BUFFER PIN,一致性讀是需要讀取表塊的ITL槽信息的,這裡C連塊的BUFFER PIN都獲取不到,談何一致性讀。 真正的一致性讀應當指涉及UNDO的操作,因為既然DML發現了BUFFER PIN上的S模式的鎖證明這個塊正在被讀,根本無需一致性讀。 三:DML語句的併發 這裡就很顯然了,ABD的AB階段不會發生明顯爭用,D階段一個會話獲取了X模式的BUFFER PIN之後,另一個必然要等待,而且此時如果再來一個SELECT語句,也會被阻塞,按照事務鎖的機制,SELECT是不會被DML阻塞的,但是這裡並不是事務鎖阻塞而是BUFFER PIN的等待。   總結: 我們知道在資料庫中無論是讀取還是修改一個塊都是極其迅速的,因此即便是以上的併發情況下,由於每個塊的BUFFER PIN鎖持有時間都極短,因此單個塊即便發生BUFFER BUSY WAITS時間也基本可以忽略不計。 除非更改大量的塊導致多個塊發生BUFFER BUSY WAITS等待,因此如果發生了BUFFER BUSY WAITS,只和DML有關,由於DML也會導致索引更新,因此出現BUFFER BUSY WAITS儘量優化DML語句。 而如果發生了CBC LATCH的等待,那就更明顯了,一定是併發過多,甚至和DML無關,只要是個SQL併發太多都會導致CBC LATCH的等待,因為表塊和葉塊都是以獨占模式獲取的CBC LATCH,解決辦法要麼是減小併發,要麼全部優化為走INDEX UNIQUE SCAN,或者通過修改隱含參數_db_block_hash_latches和_db_block_hash_buckets增大CBC LATCH和HASH BUCKET的數量。 但是需要明確的是: BUFFER BUSY WAITS和CBC LATCH的等待其本質都是併發量過大引起,並不推薦以上使用更改隱含參數的方式解決CBC LATCH的爭用。對於BUFFER PIN的爭用DML語句的優化空間也很小,只能嘗試創建唯一索引,因此應當考慮從業務角度降低併發、分散數據。  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第三方音視頻直播調研總結 調研對象:網易雲、阿裡雲、騰訊雲、金山雲、七牛雲(相關參考:http://www.chinaz.com/news/2016/1108/608584.shtml) 詳細介紹: 一、網易雲(http://netease.im/live) 架構: 功能: 1、全平臺 SDK 支持 ...
  • 下載更新apk,基本上每個app都需要的功能,以前都是自己寫,近期想藉助第三方的一個庫來做,功能齊全,感覺不錯,記錄使用過程,雖然官方也有使用教程,不過畢竟粗略,網上也能搜到,不過基本都是複製的 首先下載庫,地址改成我們自己的,檢查地址就讓它了,這個根據自己的業務調整,也能自定義 接下來是參數介紹 ...
  • Android基礎 Android系統架構 JVM和DVM的不同 區別 1. 基於的架構不同。jvm 基於棧架構,棧是位於記憶體上的一個空間,執行指令操作,需要向cpu定址; dvm 基於寄存器架構,寄存器是cpu的一個組成部分,執行指令操作無需定址直接執行。 2. 執行文件的格式不同,jvm執行的是 ...
  • XMPPFramework結構 在進入下一步之前,先給大家講講XMPPFramework的目錄結構,以便新手們更容易讀懂文章。我們來看看下圖: 雖然這裡有很多個目錄,但是我們在開發中基本只關心Core和Extensions這兩個目錄下的類。各個目錄主要用來幹嘛的? Authentication:這一 ...
  • 先說一下表結構 名字name 分數fenshu 表名test1,以下查詢的是成績排名為第三名和第四名,這個模板讓你查隨意排名段的人 select name,fenshu,mc from (select name, fenshu,dense_rank() over (order by fenshu d ...
  • 此文翻譯自 http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html 譯註:實際部署中,沒有安全控制的hadoop的,最好不要使用,因為可能很多心血會毀於一旦。 概覽 ...
  • 依個人理解,冗餘欄位就是本存在一張表的欄位,也出現在另一張表中。 例如:有三張表,用戶表、商品表、訂單表,用戶表中有欄位name,而訂單表中也存在欄位name。 對於這個欄位冗餘有好有壞 好: 從用戶表、商品表、訂單表說起,當我需要查詢“訂單表”所有數據並且只需要“用戶表”的name,一般都可以通過 ...
  • 查詢緩存 查詢緩存(Query Caching)緩存了SELECT查詢及其結果數據集,當執行一個同樣的SELECT查詢時,MySQL會從記憶體中直接取出結果,加快了查詢執行速度、減小了資料庫的壓力。執行 可以查看MySQL查詢緩存是否打開,開啟查詢緩存只需配置my.cnf文件即可,具體如下: quer ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...