Oracle 物理體系數據庫
Oracle 物理體系緩存
PGA:program global area ,私有不共享內存。session
PGA起到預處理的做用:性能
1.保存用戶的鏈接信息,如session屬性,綁定變量等;spa
2.保存用戶權限等重要信息;日誌
3.須要排序時,PGA就是排序區;blog
SGA:system global area,共享內存。排序
SGA由下組成:進程
1.共享池ip
2.數據緩衝區
3.日誌緩衝區
後臺進程:
1.PMON:process monitor 進程監視器
2.SMON:system monitor 系統監視器
3.DBWR:database writer 將數據緩衝區的數據刷到磁盤數據文件中
4.LGWR:log writer 將日誌緩衝區的數據刷到磁盤日誌文件中
5.CKPT:checkoutPoint 觸發DBWR,批量將數據緩衝區的數據刷到磁盤中。並不是是commit操做觸發DBWR,由於批量操做比單次操做效率高。
6.ARCH 歸檔日誌文件
……
數據庫:
1.數據文件
2.參數文件
3.控制文件
4.日誌文件
SGA+後臺進程 = 數據庫實例;
Oracle服務 = 實例(內存+進程)+ 數據庫(磁盤文件);
在多實例數據庫環境下,實例和數據庫是多對一的關係,可是在大部分狀況下是一對一。
SQL語句在物理體系中的流轉過程:
1.SQL進入PGA進行預處理。保存鏈接信息,權限信息。若是有排序指令,則進行排序,PGA就是排序區。若內存不夠,超出的部分須要到臨時表空間中進行排序,即在磁盤中完成排序。只要session不斷開鏈接,下次系統不須要再到磁盤中讀取相關的鏈接信息和權限信息,直接從PGA內存空間中獲取。
2.SQL匹配一條惟一的HASH值,進入SGA進行處理。先在共享池中查詢是否有存儲該HASH值,如有,則跳過語法語義檢查、權限檢查、解析,直接得到執行計劃。若無,則先進行語法語義檢查,權限檢查,沒有問題的話生成該條SQL的惟一HASH值並保存下來。而後進行解析,解析該SQL執行計劃。完成解析後將執行計劃保存起來,並和HASH值對應起來。
3.SQL進入數據緩衝區,檢查是否有須要的數據,若無,則按照執行計劃到磁盤數據庫文件中查找,找到了就帶着數據返回到數據緩衝區。
4若是SQL語句是查詢語句,則到第三步,即完成了SQL語句。若是是更新語句,則要遵循 「日誌現行」 「凡事有記錄」的原則,記錄日誌,而且要保存數據的前鏡像。而後才進行更新操做。
Tips:
1.由於Oracle有緩存的功能,若是有緩存SQL相應的鏈接信息,權限信息,執行計劃,數據等,不用去磁盤上讀取,能夠減小物理讀。因此執行相同的SQL,第二次比第一次快。
2.若是PGA內存分配過小,排序量太大,部分排序須要到磁盤上進行,IO操做增多,會下降性能。
3.commit不能觸發DBWR,而是CKPT觸發,是由於批量操做效率優於單次操做。
4.保存數據前鏡像,能夠實現回滾和數據的一致讀。
問題
1.Oracle爲何要有歸檔日誌文件的操做,爲何不直接將日誌緩衝區中的日誌信息保存到歸檔文件中。
2.沒有commit,DBWR也會將數據刷到磁盤數據庫文件中?
參考資料
「收穫,不止Oracle」