oracle實驗-體系結(jié)構(gòu)_第1頁
oracle實驗-體系結(jié)構(gòu)_第2頁
oracle實驗-體系結(jié)構(gòu)_第3頁
oracle實驗-體系結(jié)構(gòu)_第4頁
oracle實驗-體系結(jié)構(gòu)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ORACLE體系結(jié)構(gòu)Oracle體系結(jié)構(gòu)—提交(commit)探討Updatetsetobject_id=92whereobject_id=29如果執(zhí)行完這條命令,你們可以在數(shù)據(jù)庫中查詢到object_id=29被改變?yōu)?2了嗎?答:如果還是發(fā)起更新語句的本SESSION做的查詢,是可以查到變化的。一條更新語句,無論插入、修改還是刪除,最終執(zhí)行完畢后都需要執(zhí)行COMMIT或ROLLBACK的確認(rèn)。COMMIT表示用戶確認(rèn)無誤了,確實需要更新,ROLLBACK后者表示后悔了,需要撤銷剛才操作。當(dāng)用戶發(fā)起提交命令后,數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)一定會立即被DBWR進(jìn)程寫進(jìn)磁盤嗎?到底COMMIT之后的內(nèi)存數(shù)據(jù)是否會立即寫入磁盤?答:也許會,也許不會,不一定數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)每提交一次就刷出一次和積累到一定量后成批刷出,哪個性能更高?答:批量!你去銀行存款,簽字確認(rèn)等辦理完手續(xù)后,你離開銀行,由于你簽字確認(rèn)了,所以銀行工作人員執(zhí)行了COMMIT命令。如果COMMIT之后的數(shù)據(jù)不立刻刷寫到磁盤上,還是存放在SGA中,不幸事情發(fā)生了,銀行突然斷電,內(nèi)存數(shù)據(jù)丟失了!,你在回去路上不放心,到ATM機(jī)器查詢,發(fā)現(xiàn)金額沒變......從這個角度看,COMMIT之后的內(nèi)存數(shù)據(jù)應(yīng)該立即寫入磁盤,否則有斷電數(shù)據(jù)丟失的風(fēng)險!

答:COMMIT無法左右何時從數(shù)據(jù)緩沖區(qū)刷入磁盤,Oracle根據(jù)一定的規(guī)則來促成這個動作,就是緩沖區(qū)的數(shù)據(jù)積累到一定的程度,再批量刷入到磁盤中。既然是批量刷寫磁盤,那Oracle如何保證數(shù)據(jù)緩沖區(qū)數(shù)據(jù)斷電不丟失呢?答:Oracle有日志緩沖和日志文件。每次COMMIT時,日志緩沖區(qū)就會把要操作的動作寫到磁盤的日志文件里。這樣,Oracle就不一定非要將數(shù)據(jù)從數(shù)據(jù)緩沖區(qū)寫到磁盤了。磁盤的日志文件不是內(nèi)存中的日志緩沖區(qū),是永久保存不怕斷電的,斷電后可以依據(jù)磁盤里的日志文件重新操作一次,把剛才數(shù)據(jù)緩沖區(qū)丟失的數(shù)據(jù)恢復(fù)。所以,數(shù)據(jù)緩沖區(qū)是可以批量刷出的,兼顧了效率和安全既然批量刷出,既高效又安全,那是否批量越大越好?答:在數(shù)據(jù)庫運(yùn)行過程中,批量刷出的數(shù)據(jù)占數(shù)據(jù)緩沖區(qū)的比例越大,效率一般來說越高,而且也不用擔(dān)心斷電后的恢復(fù)問題。但是,如果批量刷出的數(shù)據(jù)占數(shù)據(jù)緩沖區(qū)的比例很大,那斷電后數(shù)據(jù)庫重啟的恢復(fù)數(shù)據(jù)動作必然需要更長,等待的時間也就更長。

因此這是一個平衡的問題:批量刷出的量比較小,Oracle性能就會降低,但是斷電開機(jī)恢復(fù)的時間就更短;反之批量刷出的量比較大,Oracle性能更高了,但斷電開機(jī)恢復(fù)的時間更長。由誰來負(fù)責(zé)觸發(fā)DBWR將緩沖區(qū)數(shù)據(jù)刷寫到磁盤?答:CKPT進(jìn)程,什么時候?qū)?shù)據(jù)緩沖區(qū)數(shù)據(jù)寫到磁盤的動作正是由進(jìn)程CKPT來觸發(fā)的,CKPT觸發(fā)DBWT寫出。Updatetsetobject_id=92whereobject_id=29語句執(zhí)行完畢后,如果一直不提交,最終會從數(shù)據(jù)緩沖區(qū)刷進(jìn)磁盤嗎?答:會的,因為DBWR將數(shù)據(jù)緩沖區(qū)數(shù)據(jù)寫到磁盤,不是由COMMIT決定的,而是由CKPT進(jìn)程決定的。在CKPT的觸發(fā)或者命令下,DBWR將數(shù)據(jù)緩沖區(qū)數(shù)據(jù)寫到磁盤,但是如果LGWR出現(xiàn)故障,DBWR此時還是會不聽CKPT的命令,因為Oracle在將數(shù)據(jù)緩沖區(qū)數(shù)據(jù)寫到磁盤前,會先將日志緩沖區(qū)寫入日志文件,并耐心地等待其先完成,才會去完成內(nèi)存刷到磁盤的動作,這就是凡事有記錄Oracle體系結(jié)構(gòu)應(yīng)用舉例假如某數(shù)據(jù)庫是一個很大的數(shù)據(jù)庫,數(shù)據(jù)量龐大,訪問量非常高,而共享池卻非常小,那會怎么樣?答:如共享池很快被撐滿了,緩存的東西要不斷地被擠出,結(jié)果很多SQL都難以避免硬解析,因為很快被擠出共享池消失地?zé)o影無蹤,所以數(shù)據(jù)庫開始運(yùn)行緩慢。怎么辦?加大共享池!,若是自動管理模式,就是加大SGA的大小某主機(jī)共有內(nèi)存4G,而運(yùn)行在其平臺上的數(shù)據(jù)庫是一個幾乎沒有什么訪問量的小數(shù)據(jù)庫,可能100M的共享池就足夠了,卻被開辟了3G的SGA內(nèi)存,500M的PGA內(nèi)存。但是由于操作系統(tǒng)內(nèi)存不足,導(dǎo)致主機(jī)運(yùn)行緩慢,從而導(dǎo)致數(shù)據(jù)庫運(yùn)行緩慢,該如何做?答:減少SGA大?。∪绻捎跀?shù)據(jù)緩存區(qū)過小導(dǎo)致大量數(shù)據(jù)量的數(shù)據(jù)庫產(chǎn)生大量的物理讀,該怎么辦?在SGA自動管理的情況下,加大SGA的大小。如果一個尺寸很大的排序由于內(nèi)存無法裝下,要在磁盤中進(jìn)行,而OS卻閑置著大量的內(nèi)存未使用,該如何做?答:增加PGA大小,爭取容納下排序的尺寸,從而避免物理排序!假如一個數(shù)據(jù)庫系統(tǒng)存在大量的更新操作,產(chǎn)生了大量的日志需要從REDOBUFFER中寫出到日志文件里,結(jié)果日志寫滿后切換到下一個日志文件的頻率不斷加快,由于日志頻繁切換,更新一直在停停走走,我們該如何辦?原因分析:切換過程中,數(shù)據(jù)庫需要等待切換完成才可以正常運(yùn)作,切換沒完成,LGWR就無法把REDOBUFFER的日志繼續(xù)寫出來,而數(shù)據(jù)庫中REDOBUFFER產(chǎn)生的記錄總是先于數(shù)據(jù)緩沖區(qū)產(chǎn)生的,這是串行的順序。此時,數(shù)據(jù)庫更新的動作就根本不可能成功,一定要等待日志切換成功,才能繼續(xù)工作。解決方法:加大日志組文件的尺寸,文件越大,越經(jīng)得住寫!Oracle關(guān)鍵的后臺進(jìn)程PMON(ProcessesMonitor):進(jìn)程監(jiān)視器。如果在執(zhí)行某些更新語句,未提交時進(jìn)程崩潰了,這時PMON會自動回滾該操作,無須人工去執(zhí)行ROLLBACK命令。SMON(SystemMonitor):系統(tǒng)監(jiān)視器。與PMON不同的是,SMON關(guān)注的是系統(tǒng)級的操作而非單個進(jìn)程,重點工作在于instancerecovery,除此之外,還有清理臨時表空間、清理回滾段表空間、合并空閑空間等等。LCKn僅使用于RAC數(shù)據(jù)庫,最多可由10個進(jìn)程(LCK0,LCK1,...,LCK9),用于實例間的封鎖。RECO(DistributedDatabaseRecovery):用于分布式數(shù)據(jù)庫的恢復(fù),適用于兩階段提交的場景。CKPT:用于觸發(fā)DBWR從數(shù)據(jù)緩沖區(qū)中寫出數(shù)據(jù)到磁盤。CKPT執(zhí)行越頻繁,DBWR寫出越頻繁,DBWR寫出越頻繁越不能顯示批量特性,性能就越低,但數(shù)據(jù)庫異?;謴?fù)的時候會越迅速。DBWR:是Oracle最核心的進(jìn)程之一,負(fù)責(zé)把數(shù)據(jù)從數(shù)據(jù)緩沖區(qū)寫到磁盤里,該進(jìn)程與CKPT相輔相成,也和LGWR密切相關(guān),因為DBWR想將數(shù)據(jù)緩沖區(qū)數(shù)據(jù)寫到磁盤的時候,必須通知LGWR先完成日志緩沖區(qū)寫到磁盤的動作后,方可開工。LGWR:把日志緩沖區(qū)的數(shù)據(jù)從內(nèi)存寫到磁盤的REDO文件里,完成數(shù)據(jù)庫對象創(chuàng)建、更新數(shù)據(jù)等操作過程的記錄。REDO文件非同小可,可以用來做數(shù)據(jù)庫的異?;謴?fù),所以,要保護(hù)好了這些REDO文件和后續(xù)對應(yīng)的歸檔文件。LGWR一定要按照順序記錄日志,但是多進(jìn)程難以保證順序,因此LGWR只能采用單進(jìn)程。LGWR會在5種情況下運(yùn)行:每隔3秒鐘,LGWR運(yùn)行一次;任何COMMIT觸發(fā)LGWR運(yùn)行一次;DBWR要把數(shù)據(jù)從數(shù)據(jù)緩沖區(qū)寫到磁盤,觸發(fā)LGWR運(yùn)行一次;日志緩沖區(qū)滿三分之一或記錄滿1MB;聯(lián)機(jī)日志文件切換也將觸發(fā)LGWRARCH:它的作用是在LGWR寫日志到需要覆蓋重寫的時候,觸發(fā)ARCH進(jìn)程去轉(zhuǎn)移日志文件,復(fù)制出去形成歸檔日志文件,以免丟失。Oracle性能優(yōu)化構(gòu)造環(huán)境:通過執(zhí)行上述SQL語句,保證t表已經(jīng)存在,且清空共享池第二次優(yōu)化,綁定變量第三次,靜態(tài)改寫executeimmediate是一種動態(tài)SQL的寫法,常用于表名、字段名是變量、入?yún)⒌那闆r,由于表名未知,不能直接寫SQL語句,所以要靠動態(tài)SQL語句根據(jù)傳入的表名參數(shù),來拼成一條SQL語句,由executeimmediate調(diào)用執(zhí)行。但本例中,insertintotvalues(i)表名已知,顯然是多此一舉。優(yōu)化原理

proc3實現(xiàn)了綁定變量,而且動態(tài)SQL的特點是執(zhí)行過程中再解析,而靜態(tài)SQL是編譯的過程就解析好了。分析第四優(yōu)化,批量提交在proc3中,每插入1條記錄,就執(zhí)行一次commit語句,而每次commit執(zhí)行會做3件事:(1)觸發(fā)LGWR將REDOBUFFER寫出到日志文件中;(2)并且將回滾段的活動事務(wù)標(biāo)記為不活動;(3)同時讓回滾段中記錄對應(yīng)前鏡像記錄的所在位置標(biāo)記為可以重寫。所以commit的開銷并不大,單次提交可能需要0.001秒。另外不管多大批量操作后的提交,也是做這3件事,所花費的總時間不可能超過1秒。優(yōu)化原理第五優(yōu)化,集合寫法

把原先的執(zhí)行100萬條SQL語句變成了一條SQL語句,一條一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論