是一個數據庫管理系統,它提供了一種全面、開放、集成的方法來管理信息。算法
Oracle服務器由Oracle數據庫和Oracle實例組成。sql
oracle數據庫軟件和Oracle數據庫軟件能夠分開存儲。oracle數據庫軟件通常存放在oralce服務器的本地硬盤上,而Oracle數據庫實例所對應的文件(.ctl、.log、.dbf)通常存放在存儲服務器上。數據庫
一個經常使用的冗餘結構以下圖所示:緩存
體系結構圖服務器
存儲服務器網絡
一個Oracle數據庫能夠對應多個數據庫實例。對於數據庫實例a、b,和數據庫db1,若是有1萬個用戶鏈接數據庫db1,則其中5千個用戶鏈接到實例a,5千個用戶鏈接到實例b(RAC技術)。數據結構
與Oracle相關聯的內存結構包括:oracle
系統全局區(SGA):由全部服務器進程後臺進程共享日誌
程序全局區(PGA): 專用於每個服務器進程或後臺進程,每個進程使用一個PGA。server
SGA是包含了數據庫實例控制信息和數據的內存區。
其中,咱們須要着重關心的是共享池(Share Pool)和數據庫緩衝區高速緩存(Database buffer cache)。
共享池:緩存可在各個用戶之間共享的各個結構;(SQL語句以及對應的執行計劃)
Streams 池:由Oracle Streams使用;
大型池:這是一個可選的區域,可爲某些大型進程(如Oeacle的備份和恢復操做、I/O服務器進程)提供大量內存分配;
Java池:用於Java虛擬機(JVM)中特定會話的全部Java代碼和數據;
數據庫緩衝區高速緩存:緩存從數據庫檢索的數據塊
重作日誌緩衝區:高速緩存重作信息(用於實例恢復),直到能夠將其寫入磁盤中存儲的物理重作日誌
對於每個用戶進程,oracle服務器都會創建一個與之對應的服務器進程。也就是說當前若是有100個用戶與oracle服務器進行鏈接,那麼,oracle將創建100個服務器進程來處理用戶鏈接。
控制文件:記錄了各文件存放的位置以及當前的運行狀態;
數據文件:存放數據;
重作日誌文件:對數據文件全部的修改記錄;
系統監視器: 出現故障後,在啓動實例時執行崩潰恢復任務,對共享池中存在的內存碎片進行整理。
進程監視器: 用戶進程失敗時,執行進程清理任務;對sql process進行整理。
數據庫寫進程:將數據庫緩衝區高速緩存中修改後的的數據塊寫入數據文件;
日誌寫進程:
觸發條件:
歸檔進程: 發生日誌切換時將重作日誌文件複製到歸檔存儲器
檢查點: 經過更新全部數據文件的和控制文件指出新的檢查點
Oracle數據庫服務器由Oracle數據庫和Oracle實例組成,Oracle實例由系統全局區SGA的內存結構和後臺進程組成。這些後臺進程能夠處理運行實例時所涉及到的大量後臺任務。
客戶端輸入SQL語句
SQL語句經過網絡到達數據庫實例
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兩個進程再繁忙,用戶也是感覺不到的。
算法 :使用最近最少使用算法管理緩衝區
高速緩衝區狀態