記住:二八法則sql
百分之八十的功能只用到了百分之二十的知識點。而人的時間精力是寶貴的,但願你們均可以有目標有反饋有做用的學習,讓學習落地。數據庫
數據庫體系結構以下(很是重要):緩存
舉例一個普通查詢執行順序:session
(select object_name from t where object_id = 29;)分佈式
用戶發起請求 ---------> PGA保存用戶鏈接和權限信息(只要不斷開session,下次直接從PGA中讀取),並比配一條惟一HASH值(身份證) --------> SGA共享池查看是否有HASH值,若是沒有即檢查語法和語義是否正確,是否有權限,沒問題就存儲這個HASH值。 ------> 解析語句(如:在object_id有索引的狀況下估算用索引查仍是全表掃描代價(COST)低用哪一個)並存儲執行計劃(與惟一HASH值對應在一塊兒) --------> 進入內數據緩存區查找如找不到進入數據庫文件查找並將值返回學習
測試腳本:測試
drop table t; create table t as select * from all_object; create index idx_object_id on t(object_id); set autotrace on set linesize 1000 set timing on select object_name from t where object_id = 29;
set autotrace on 開啓跟蹤sql的執行計劃和執行統計信息spa
set timing on 跟蹤語句執行完成時間。線程
執行結果:日誌
第一次
第二次
所花費的時間減小了
花費資源也少了
由於第二次不須要保存用戶鏈接信息和權限信息,也不須要估算執行方法,並且數據已經緩存到數據緩存區,花費更低了。
舉例一個普通更新執行順序:
(update t set object_id = 92 where object_id = 29;)
查找數據流程和SELECT語句同樣,不一樣的是以後的流程。
當數據在數據緩存區中被修改以後系統會調用DBWR進程將數據寫入到DB數據文件中。
Oracle 日誌系統:
Oracle日誌系統記錄了用戶的操做信息:
A操做:建表 B操做:插入數據 C操做:更新數據
若是誤更新或誤刪除數據,只須要執行B C操做,若是誤刪表,只需執行A B C操做
進程LGWR就是將日誌緩存區中數據寫入到數據庫的日誌文件中
由於日誌文件數量有限,當記錄滿了以後,ARCH進程會將一部分日誌文件備份並清空再次使用。
Oracle的COMMIT 與 ROLLBACK
Oracle中的數據是在數據緩存區中修改的,但不是確認COMMIT以後當即寫入數據庫中(還在緩存區),而是記錄修改日誌。當修改記錄達到必定量級再一次性刷入數據文件中。如何防止斷電內存數據消失呢?記錄日誌是事實存入磁盤的,因此斷電以後會自動讀取日誌文件恢復數據。
而控制數據什麼時候從數據緩存區存入數據庫是CKPT進程決定的,可是,當LGWR進程出現問題時,DBWR進程不會遵從CKPT命令將數據寫入磁盤,而是等待LGWR完成。
即先有記錄後有執行。
更新時,查詢到相應數據到數據緩存區後,會在回滾表空間相應回滾事務表上分配事物槽,從而在回滾表空間分配到空間,該動做須要記錄日誌到日誌緩存區;
在數據緩存區中建立未更改數據的鏡像,這個鏡像數據也會寫入磁盤的數據文件裏(回滾表空間的數據文件),也會記錄日誌。
以後才容許修改數據,並記錄日誌;
若是執行了COMMIT,日誌緩存區當即記錄這個提交信息,而後將回滾段事物標記爲INACTIVE狀態,表示容許重寫;
若是執行了ROLLBACK,將回滾段的修改前鏡像讀取出來,修改入緩存區完成回滾。會記錄日誌。
DML語句特色:
因爲其會改變數據庫的數據。會產生未來用於恢復數據的redo和用於回退的undo。因爲undo也須要保護,會有專門的保護undo的redo。
Oracle的進程介紹(核心的幾個):
PMON進程(Processes Monitor):進程監視器。
若是執行更新未提交時進程崩潰了,PMON會自動回滾該操做;
若是RECO異常失敗了,PMON會重啓RECO進程;
若是LGWR進程失敗,PMON甚至會終止這個實例等等。。。。
SMON進程(System Monitor):系統監視器。與PMON監視單個進程不一樣,它的工做在於 intance recovery,此外還有清理臨時表空間、清理回滾段表空間、合併 空閒空間等等。。。。
LCKn進程:僅使用RAC數據庫,最多10個進程(LCK0-LCK9),用於實例間的封鎖。
RECO進程(Distributed Database Recovery):用於分佈式數據庫的恢復,適用於兩階段式提交場景。如:多個數據庫A、B、C,某應用跨三個數據庫,三個數據 庫都提交成功才成功,否者都失敗的狀況。
CKPT進程:由Oracle的 FAST_START_MTTR_TARGET參數控制,用於觸發DBWR進程。
DBWR進程:Oracle最核心進程之一,負責將數據從數據緩存區寫入到磁盤。由CKPT進程觸發,執行前會強制通知LGWR進程將日誌數據寫入日誌文件中。
LGWR進程:Oracle最核心進程之一,將日誌數據寫入日誌文件中。爲了保證操做日誌的順序,LGWR進程是單線程的。
每隔三秒鐘執行一次;
任何COMMIT觸發LGWR執行一次;
DBWR將數據寫入磁盤,LGWR運行一次;
日誌緩衝區滿三分之一或滿1MB,執行一次;
聯機日誌文件切換也將觸發LGWR。
ARCH進程:做用是當LGWR寫日誌,文件滿了須要覆蓋重寫時,觸發ARCH進程複製日誌文件出去造成歸檔文件,以避免日誌丟失。