Oracle體系結構概述(1)| ORACLE的組成

一、總述

Oracle由實例和數據庫組成。如下:
在這裏插入圖片描述!

1. 實例

在這裏插入圖片描述

1)SGA

SGA(System Global Area)是一個共享內存區,被劃分爲共享池(Shared pool)、數據緩衝區緩存(Database buffer cache)、日誌緩衝區(Redo log buffer)、大池(Large pool)、Java池(Java pool)等幾類。

在這裏插入圖片描述

· 共享池(Shared pool)

用來解析SQL並保存相關執行計劃。是SQL執行中最先訪問到的內存部件。
SQL進入共享池時帶有唯一的HASH值,先查詢共享池中是否已經存有該HASH值,若不存在,需要查詢語法(如from是否寫成form)和語義(如id字段不存在)是否正確。隨後進行解析,如某一列有索引的情況下判斷是走索引還是全表掃描更高效。
在這裏插入圖片描述
Shared Pool還可以細分:
library cache(庫緩存)
Data dictionary cache(數據字典緩存):數據字典在硬盤上,但是它經常被讀取,所以要緩存在共享池裏的數據字典緩存上
ps:以後數據庫看命中率的話不能通過看數據字典緩存的命中率判斷空間是否夠,而是要庫緩存是否夠

eg. 優化解析次數的執行計劃查看

  • 初始化
SQL> set linesize 1000
SQL> set autotrace on;
  • 第一次執行

在這裏插入圖片描述

  • 第二次執行

在這裏插入圖片描述
可以看到,SQL在第一次執行的時候已經完成了語法和語義的判斷,故第二次執行的時候shared pool中的這些事不用再次執行,recursive calls(遞歸調用)次數減少爲0。

· 數據緩衝區緩存(Database buffer cache)

首次執行某條SQL指令時,數據一般不在SGA的數據緩衝區緩存裏,只能從磁盤中獲取,產生了物理讀;
下次執行的時候直接從緩衝區緩存獲取數據就行了,效率比磁盤高。
在這裏插入圖片描述
select操作的話把原先free的塊,還保持clean的狀態;DML操作的時候把原先free的塊改成dirtyclean的塊在內存中被抹掉,dirty的塊最終都會寫回硬盤,在數據庫沒意外的情況下(dirty的塊一般是新舊值成對出現)乾淨塊會滿掉(拼命地select),此時要把之前的clean塊給erase掉,erase哪個塊依據最近最少使用算法(LRU)還沒寫回硬盤的髒塊在排隊的時候按照第一次變髒的時間來排列(檢查點隊列)寫數據髒塊的唯一依據就是時間,和是否提交沒關係李四先寫沒提交,張三後寫提交,會把李四的日誌一起提交(要提交一起提交)

· 日誌緩衝區(Redo log buffer)

【這裏我們需要把數據庫緩衝區緩存日誌緩衝區結合起來看】:
1)爲了保證效率,數據庫緩衝區緩存中的數據並不是commit以後便寫入數據文件,而是緩存區的數據累積到一定程度後,批量刷入硬盤;
2)爲了保證數據的安全性,commit時日誌緩衝區會把要操作的動作寫入磁盤的日誌文件中。
PS:並不是數據庫緩衝區緩存中的數據越多的時候提交效率越高,批量刷出的量越大,斷電後需要的恢復時間就越長。

【問:若一個DML操作一直不提交,數據最終會從數據緩衝區寫入磁盤嗎?】
【答:會。DBWR是否將數據緩存區數據寫入磁盤,不是由COMMIT決定的,而是由CKPT進程觸發而決定的。】

ps:FAST_MTTR_TARGET參數決定了一旦出現斷電情況,smon進程最多用多長時間來做實例恢復。
通過調整該參數,會調配CKPT在適當的時候調用DBWR進程。

日誌緩衝區的內容寫內存文件的條件:
1)commit
2)3秒。日誌緩衝區的內容在內存中的內容最多保存3秒,超過3秒的內容都會到日誌文件中去
3)日誌緩衝區三分之一滿時。
4)日誌緩衝區達到一定閾值時(9i的數據庫是1M時,10g以後的不確定)
5)對應的數據塊已經要寫入硬盤了(保障性措施)–日誌永遠要早於對應的數據塊以後若出現描述和被描述不一致的情況,則需要以日誌爲依據。這樣在日誌中會出現rba指針(重做字節地址)(檢查點位置),這根線上對應的數據都寫回數據塊了,也是前滾的起點(RBA指針放在硬盤上的控制文件內部)根據檢查點隊列寫髒塊,在日誌文件上會出現檢查點位置

2.數據庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章