Oracle體系結構概述與SQL解析剖析


Oracle服務器

是一個數據庫管理系統,它提供了一種全面、開放、集成的方法來管理信息。

Oracle服務器由Oracle數據庫Oracle實例組成。

oracle數據庫軟件和Oracle數據庫軟件可以分開存儲。oracle數據庫軟件一般存放在oralce服務器的本地硬盤上,而Oracle數據庫實例所對應的文件(.ctl、.log、.dbf)一般存放在存儲服務器上。

一個常用的冗余結構如下圖所示:

Oracle體系結構

體系結構圖

image-20201012222031922

存儲服務器

實例和數據庫的關系

一個Oracle數據庫可以對應多個數據庫實例。對於數據庫實例a、b,和數據庫db1,如果有1萬個用戶連接數據庫db1,則其中5千個用戶連接到實例a,5千個用戶連接到實例b(RAC技術)。

數據庫結構

image-20201013084158038

Oracle內存結構

與Oracle相關聯的內存結構包括:

  • 系統全局區(SGA):由所有服務器進程后台進程共享

  • 程序全局區(PGA): 專用於每一個服務器進程或后台進程,每一個進程使用一個PGA。

SGA是包含了數據庫實例控制信息和數據的內存區。

image-20201013084249130

其中,我們需要着重關心的是共享池(Share Pool)和數據庫緩沖區高速緩存(Database buffer cache)。

SGA包含的數據結構:

  • 共享池:緩存可在各個用戶之間共享的各個結構;(SQL語句以及對應的執行計划)

  • Streams 池:由Oracle Streams使用;

  • 大型池:這是一個可選的區域,可為某些大型進程(如Oeacle的備份和恢復操作、I/O服務器進程)提供大量內存分配;

  • Java池:用於Java虛擬機(JVM)中特定會話的所有Java代碼和數據;

  • 數據庫緩沖區高速緩存:緩存從數據庫檢索的數據塊

  • 重做日志緩沖區:高速緩存重做信息(用於實例恢復),直到可以將其寫入磁盤中存儲的物理重做日志

Oracle進程結構

image-20201013091622609

對於每一個用戶進程,oracle服務器都會建立一個與之對應的服務器進程。也就是說當前如果有100個用戶與oracle服務器進行連接,那么,oracle將建立100個服務器進程來處理用戶連接。

Oracle實例管理

  • 控制文件:記錄了各文件存放的位置以及當前的運行狀態;

  • 數據文件:存放數據;

  • 重做日志文件:對數據文件所有的修改記錄;

  • 系統監視器: 出現故障后,在啟動實例時執行崩潰恢復任務,對共享池中存在的內存碎片進行整理。

  • 進程監視器: 用戶進程失敗時,執行進程清理任務;對sql process進行整理。

  • 數據庫寫進程:將數據庫緩沖區高速緩存中修改后的的數據塊寫入數據文件;

  • 日志寫進程:

    ​ 觸發條件:

    • 當某個事務提交時
    • 當重做日志緩沖區中變化的記錄超過1MB時
    • 當重做日志緩沖區中所存的記錄已超過緩沖區容量的1/3
    • 在DBWR將數據庫高速緩沖區中修改過的數據塊寫到數據文件之前
    • 每3秒鍾

    歸檔進程: 發生日志切換時將重做日志文件復制到歸檔存儲器

    檢查點: 通過更新所有數據文件的和控制文件指出新的檢查點

Oracle數據庫服務器由Oracle數據庫和Oracle實例組成,Oracle實例由系統全局區SGA的內存結構和后台進程組成。這些后台進程可以處理運行實例時所涉及到的大量后台任務。

物理數據庫結構

image-20201013211923980

SQL解析剖析

讀數據

  1. 客戶端輸入SQL語句

  2. SQL語句通過網絡到達數據庫實例

  3. server process接收SQL語句

    3.1 判斷SQL在Shared Pool中是否存在緩存

    ​ a. 如果有,則在shared pool中找到對應的sql語句以及對應的執行計划,然后再去執行

    ​ b. 執行3.1

    3.1 SQL解析成執行計划,然后才能執行

    解析流程:

    ​ a. 判斷SQL語法是否存在問題

    ​ b. 判斷SQL對應的表、視圖是否存在

    ​ c. 判斷用戶是否有對應表、視圖的權限

    ​ d. 判斷如何執行(挑出最優的執行計划作為執行計划,最費時間,耗費CPU,I/O資源)

    ​ e. 選擇最優執行方案生成執行計划

    3.1 執行SQL

    SQL Process根據SQL語句對應的執行計划,執行SQL,讀取高速緩存,如果緩存中存在數據,則將緩存中的數據返回給用戶,否則讀取dbf中的數據並將數據存入緩存,然后將數據返回給用戶。

    邏輯讀:從內存中讀取數據

    物理讀:從物理磁盤中讀取數據

緩存命中率: 命中率低一定有問題,命中率高不一定沒問題。

比起緩存命中率,我們更關心每秒物理讀。

寫數據

sql process 將表讀到內存中,然后再對表進行修改。Oracle數據庫對dbf文件的修改都會強日志。

數據庫寫進程(DBWn)負責將修改后的數據寫入數據文件dbf。

日志寫進程(LGWR)將日志寫入日志文件。

(單一職責原則)

軟解析和硬解析

軟解析: 從高速緩存中獲取執行計划

硬解析:對SQL process接收到的SQL進行解析,判斷sql語法,查詢的表是否存在,是否有權限,判斷如何執行(挑出最優的執行計划作為執行計划,最費時間,耗費CPU,I/O資源);

SQL Process執行sql后,會將數據放入高速緩存,再由DBRn和LGER分別寫入數據文件dbf和日志文件log。因此,對於用戶來說,數據庫響應快慢由SQL Process直接影響。哪怕DBRn和LOWR兩個進程再繁忙,用戶也是感受不到的。

服務器進程和數據庫緩沖區高速緩沖

image-20201013205817180

算法 :使用最近最少使用算法管理緩沖區

高速緩沖區狀態

  • 空閑或未使用:實例剛啟動,緩沖區為空
  • 已連接: SQL Process正在對內存中的數據進行讀寫操作。其他會話正在等待
  • 臟數據 :緩沖中的數據和磁盤中的數據不一致(對緩沖中的數據進行了修改,但是還沒有寫入磁盤)。需要先將臟數據寫入磁盤才能騰出緩沖區。
  • 干凈的 :緩沖區已解除連接。如果沒有再次使用當前內容(數據塊),現在可以考慮立即騰出緩沖區。此時,不是緩沖區中的數據快已經同磁盤中的數據保持同步,就是緩沖區中包含對數據快的讀取一致性快照。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM