一條SQL在記憶體結構與後臺程序工作機制
oracle伺服器由資料庫以及例項組成,資料庫由資料檔案,控制檔案等物理檔案組成,例項是由記憶體結構+後臺程序組成,例項又可以看做連線資料庫的方式,在我看來就好比一家公司,例項就是一個決策的辦公室,大大小小的決定都要從這個辦公室解決。
例項分成記憶體結構以及後臺程序部分。
記憶體結構主要可以分為:共享池(shared pool),資料庫高速緩衝區(data buffer cache),重做日誌緩衝區(Redo Log Buffer Cache)。
三大記憶體池:
共享池(shared pool):用來存放一些共享的資源,比如sql,pl/sql,資料字典一些資訊,一條SQL的執行首先在shared pool中進行校驗,解析,然後在執行。它主要由兩個記憶體結構區域構成:Library cache和Data dictionary cache,共享池會對執行的sql進行校驗,然後解析,最後執行,這裡提到兩個概念:
硬解析:沒有被執行過的sql,會在shared pool中進行校驗,然後解析,最後執行
1.檢視語法是否錯誤
2.檢視資料字典,檢查SQL語句中涉及的物件和列是否存在
3.通過優化器建立一個最佳的執行計劃
4.將該遊標所產生的執行計劃,SQL文字快取到Library cache的hash中
軟解析:將相同的sql存放在library cache中,減少硬解析一個或多個步驟,從而減少大量的資源使用。
所以寫sql最好加上變數,減少硬解析,也就減少了IO的開銷。
修改共享池的大小:ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;
資料庫高速緩衝區(data buffer cache):SGA的一部分,oracle利用buffer cache來管理data block資料塊(8k),及使用者使用過的資料,比如使用者查詢到磁碟上的資料就儲存在這,修改資料時,同時儲存資料庫被修改前(前映象)和修改後(後鏡像),避免了對資料檔案的直接操作,cache的最終目的還是減少磁碟的IO。一條SQL的執行,首先要將資料檔案中的資料提到buffer cache中來修改,然後在buffer cache中修改完,再將這些髒資料寫回資料檔案中。
工作機制:假設查詢到,或者更改的資料都已放在了buffer cache中,buffer cache的存量就那麼大,怎麼保證buffer cache不斷更新呢?cache利用連結串列來實現資料塊的快速定位,一個數據塊8K大小,一次讀取會有若干個資料塊,緩衝區則是利用LRU(最近最少使用)演算法來進行清除以前沒用過的資料塊,一次來釋放記憶體。從而保證了一致性。
髒資料:一條更新sql,需要把資料檔案的資料提到記憶體中來修改,但是還沒有寫回資料檔案,這時在buffer cache中的這些已經更改過的不一致資料就叫做髒資料。
重做日誌緩衝區(Redo Log Buffer Cache):記錄一些ddl,dml操作的緩衝區,用來快取對於資料塊的所有修改。如果正在執行一條sql語句,在記憶體中已經修改完成,但是還沒有將這些髒資料寫進資料檔案中,但是斷電了,記憶體中謝謝東西被釋放掉了,這些東西就真的沒了,但是有了log buffer,他會先記錄,將這些操作記錄下來,下次重新開機的時候,這些操作記憶體可以在log buffer中找到,重新執行一遍,相當於資料沒有丟,還是保證了資料的一致性。
後臺主要五大程序:
dbwn(寫程序):顧名意義,oracle中有很多後臺程序,寫程序是很重要的,就是把髒資料寫進磁碟的一個過程。
1.髒資料閾值達到25%時
2.掃描到整個buffer cache沒有空閒時
3.ddl,dml操作時
4.表空間離線
5.熱備命令時
這些都會觸發dbwn寫程序
lgwr(log日誌寫程序):將log buffer緩衝區中記錄的操作寫入物理檔案,日誌檔案中去,所以這個操作必須比較快速切頻繁才能保證資料的一致性,同時也必須在dbwn操作之前觸發lgwr,否則資料檔案已經寫進去了,日誌檔案還沒有記錄是不行的。
1.commit;
2.log buffer達到記憶體的三分之一時
3.dbwn寫進髒資料之前
4.每隔3秒
ckpt(檢查點程序):檢查點的主要任務就是督促dbwn重新整理髒塊,也類似一個scn號,記錄一個時間點的行為
1.排程資料寫
2.會將自己完成的檢查點寫到資料檔案頭
3.把已經完成的檢查點寫進控制檔案中
smon(系統程序):system monitior,系統監控,資料庫的主程序,系統可以根據smon程序來判斷oracle是否啟動
1.系統監控管理,定期合併空閒,回收臨時段
2.做例項的恢復,前滾,後滾,釋放資源
pmon(監控程序):監控其他非核心程序,釋放垃圾程序。如果你的程序卡死了,斷掉了,pmon會幫你釋放掛掉程序佔得資源。
一條SQl的執行過程:
&n