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

Oracle服務器

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

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

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相關聯的內存結構包括:oracle

  • 系統全局區(SGA):由全部服務器進程後臺進程共享日誌

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

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正在對內存中的數據進行讀寫操做。其餘會話正在等待
  • 髒數據 :緩衝中的數據和磁盤中的數據不一致(對緩衝中的數據進行了修改,可是尚未寫入磁盤)。須要先將髒數據寫入磁盤才能騰出緩衝區。
  • 乾淨的 :緩衝區已解除鏈接。若是沒有再次使用當前內容(數據塊),如今能夠考慮當即騰出緩衝區。此時,不是緩衝區中的數據快已經同磁盤中的數據保持同步,就是緩衝區中包含對數據快的讀取一致性快照。
相關文章
相關標籤/搜索