1. 程式人生 > >Oracle體系結構概述與SQL解析剖析

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

## Oracle伺服器 是一個數據庫管理系統,它提供了一種全面、開放、整合的方法來管理資訊。 Oracle伺服器由**Oracle資料庫**和**Oracle例項**組成。 oracle資料庫軟體和Oracle資料庫軟體可以分開儲存。oracle資料庫軟體一般存放在oralce伺服器的本地硬碟上,而Oracle資料庫例項所對應的檔案(.ctl、.log、.dbf)一般存放在儲存伺服器上。 一個常用的冗餘結構如下圖所示: ![Oracle體系結構](https://raw.githubusercontent.com/code81192/art-demo/master/img/Oracle體系結構.png) ​ **體系結構圖** ![image-20201012222031922](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201012222031922.png) ​ **儲存伺服器** ## 例項和資料庫的關係 一個Oracle資料庫可以對應多個數據庫例項。對於資料庫例項a、b,和資料庫db1,如果有1萬個使用者連線資料庫db1,則其中5千個使用者連線到例項a,5千個使用者連線到例項b(RAC技術)。 ## 資料庫結構 ![image-20201013084158038](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201013084158038.png) ### Oracle記憶體結構 與Oracle相關聯的記憶體結構包括: - **系統全域性區(SGA):**由所有伺服器程序後臺程序共享 - **程式全域性區(PGA):** 專用於每一個伺服器程序或後臺程序,每一個程序使用一個PGA。 SGA是包含了資料庫例項控制資訊和資料的記憶體區。 ![image-20201013084249130](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201013084249130.png) 其中,我們需要著重關心的是共享池(Share Pool)和資料庫緩衝區快取記憶體(Database buffer cache)。 #### SGA包含的資料結構: - **共享池:**快取可在各個使用者之間共享的各個結構;(SQL語句以及對應的執行計劃) - **Streams 池:**由Oracle Streams使用; - **大型池:**這是一個可選的區域,可為某些大型程序(如Oeacle的備份和恢復操作、I/O伺服器程序)提供大量記憶體分配; - **Java池:**用於Java虛擬機器(JVM)中特定會話的所有Java程式碼和資料; - **資料庫緩衝區快取記憶體:**快取從資料庫檢索的資料塊 - **重做日誌緩衝區:**快取記憶體重做資訊(用於例項恢復),直到可以將其寫入磁碟中儲存的物理重做日誌 ### Oracle程序結構 ![image-20201013091622609](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201013091622609.png) 對於每一個使用者程序,oracle伺服器都會建立一個與之對應的伺服器程序。也就是說當前如果有100個使用者與oracle伺服器進行連線,那麼,oracle將建立100個伺服器程序來處理使用者連線。 ### Oracle例項管理 ![](https://raw.githubusercontent.com/code81192/art-demo/master/img/20201013212039.png) - **控制檔案:**記錄了各檔案存放的位置以及當前的執行狀態; - **資料檔案:**存放資料; - **重做日誌檔案:**對資料檔案所有的修改記錄; - **系統監視器:** 出現故障後,在啟動例項時執行崩潰恢復任務,對共享池中存在的記憶體碎片進行整理。 - **程序監視器:** 使用者程序失敗時,執行程序清理任務;對sql process進行整理。 - **資料庫寫程序:**將資料庫緩衝區快取記憶體中修改後的的資料塊寫入資料檔案; - **日誌寫程序:** ​ 觸發條件: - 當某個事務提交時 - 當重做日誌緩衝區中變化的記錄超過1MB時 - 當重做日誌緩衝區中所存的記錄已超過緩衝區容量的1/3 - 在DBWR將資料庫高速緩衝區中修改過的資料塊寫到資料檔案之前 - 每3秒鐘 **歸檔程序:** 發生日誌切換時將重做日誌檔案複製到歸檔儲存器 **檢查點:** 通過更新所有資料檔案的和控制檔案指出新的檢查點 Oracle資料庫伺服器由Oracle資料庫和Oracle例項組成,Oracle例項由系統全域性區SGA的記憶體結構和後臺程序組成。這些後臺程序可以處理執行例項時所涉及到的大量後臺任務。 ### 物理資料庫結構 ![image-20201013211923980](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201013211923980.png) ## 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](https://raw.githubusercontent.com/code81192/art-demo/master/img/image-20201013205817180.png) **演算法** :使用**最近最少使用演算法**管理緩衝區 **高速緩衝區狀態** - **空閒或未使用**:例項剛啟動,緩衝區為空 - **已連線:** SQL Process正在對記憶體中的資料進行讀寫操作。其他會話正在等待 - **髒資料** :緩衝中的資料和磁碟中的資料不一致(對緩衝中的資料進行了修改,但是還沒有寫入磁碟)。需要先將髒資料寫入磁碟才能騰出緩衝區。 - **乾淨的** :緩衝區已解除連線。如果沒有再次使用當前內容(資料塊),現在可以考慮立即騰出緩衝區。此時,不是緩衝區中的資料快已經同磁碟中的資料保持同步,就是緩衝區中包含對資料快的讀取一致性