詳細(xì)分析ORACLEAWR報(bào)告_第1頁
詳細(xì)分析ORACLEAWR報(bào)告_第2頁
詳細(xì)分析ORACLEAWR報(bào)告_第3頁
詳細(xì)分析ORACLEAWR報(bào)告_第4頁
詳細(xì)分析ORACLEAWR報(bào)告_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

........專業(yè)資料精心整理專業(yè)資料精心整理....專業(yè)資料精心整理詳細(xì)分析詳細(xì)分析ORACLEAWR報(bào)告AWR是Oracle10g版本推出的新特性,全稱叫AutomaticWorkloadRepository-自動(dòng)負(fù)載信息庫,AWR是通過對(duì)比兩次快,照(snapshot)收集到的統(tǒng)計(jì)信息,來生成報(bào)表數(shù)據(jù),生成的報(bào)表包括多個(gè)部分。WORKLOADREPOSITORYreportforDBNameDBIdInstanceInstnumReleaseRACHostICCI1314098396ICCI1.0YESHPGICCI1SnapIdSnapTimeSessionsCursors/SessionBeginSnap:267825-Dec-0814:04:50241.5EndSnap:268025-Dec-0815:23:37261.5Elapsed:78.79(mins)DBTime:mins)11.05(DBTime不包括Oracle后臺(tái)進(jìn)程消耗的時(shí)間。如果DBTime遠(yuǎn)遠(yuǎn)小于Elapsed時(shí)間,說明數(shù)據(jù)庫比較空閑。dbtime=cputime+waittime(不包含空閑等待)(非后臺(tái)進(jìn)程)說白了就是dbtime就是記錄的服務(wù)器花在數(shù)據(jù)庫運(yùn)算(非后臺(tái)進(jìn)程)和等待(非空閑等待)上的時(shí)間DBtime=cputime+allofnonidlewaiteventtime在79分鐘里(其間收集了3次快照數(shù)據(jù)),數(shù)據(jù)庫耗時(shí)11分鐘,RDA數(shù)據(jù)中顯示系統(tǒng)有8個(gè)邏輯CPU(4個(gè)物理CPU),平均每個(gè)CPU耗時(shí)1.4分鐘,CPU利用率只有大約2%(1.4/79)。說明系統(tǒng)壓力非常小。列出下面這兩個(gè)來做解釋:ReportA:SnapIdSnapTimeSessionsCurs/Sess---------------------------------------------BeginSnap:461024-Jul-0822:00:546819.1EndSnap:461224-Jul-0823:00:25171.7Elapsed:59.51(mins)DBTime:466.37(mins)ReportB:SnapIdSnapTimeSessionsCurs/Sess---------------------------------------------BeginSnap:309813-Nov-0721:00:373913.6EndSnap:310213-Nov-0722:00:154016.4Elapsed:59.63(mins)DBTime:19.49(mins)服務(wù)器是AIX的系統(tǒng),4個(gè)雙核cpu,共8個(gè)核:/sbin>bindprocessor-qTheavailableprocessorsare:01234567先說ReportA,在snapshot間隔中,總共約60分鐘,cpu就共有60*8=480分鐘,DBtime為466.37分鐘,則:cpu花費(fèi)了466.37分鐘在處理Oralce非空閑等待和運(yùn)算上(比方邏輯讀)也就是說cpu有466.37/480*100%花費(fèi)在處理Oracle的操作上,這還不包括后臺(tái)進(jìn)程看ReportB,總共約60分鐘,cpu有19.49/480*100%花費(fèi)在處理Oracle的操作上很顯然,2中服務(wù)器的平均負(fù)載很低。從awrreport的Elapsedtime和DBTime就能大概了解db的負(fù)載??墒菍?duì)于批量系統(tǒng),數(shù)據(jù)庫的工作負(fù)載總是集中在一段時(shí)間內(nèi)。如果快照周期不在這一段時(shí)間內(nèi),或者快照周期跨度太長而包含了大量的數(shù)據(jù)庫空閑時(shí)間,所得出的分析結(jié)果是沒有意義的。這也說明選擇分析時(shí)間段很關(guān)鍵,要選擇能夠代表性能問題的時(shí)間段。ReportReportSummaryCacheSizesBeginEndBufferCache:3,344M3,344MStdBlockSize:8KSharedPoolSize:704M704MLogBuffer:14,352K顯示SGA中每個(gè)區(qū)域的大小(在AMM改變它們之后),可用來與初始參數(shù)值比較。sharedpool主要包括librarycache和dictionarycache。librarycache用來存儲(chǔ)最近解析(或編譯)后SQL、PL/SQL和Javaclasses等。librarycache用來存儲(chǔ)最近引用的數(shù)據(jù)字典。發(fā)生在librarycache或dictionarycache的cachemiss代價(jià)要比發(fā)生在buffercache的代價(jià)高得多。因此sharedpool的設(shè)置要確保最近使用的數(shù)據(jù)都能被cache。LoadProfilePerSecondPerTransactionRedosize:918,805.72775,912.72Logicalreads:,521.7732,974.06Blockchanges:,817.9511,535.22Physicalreads:68.2657.64Physicalwrites:362.59306.20Usercalls:326.69275.88Parses:38.6632.65Hardparses:0.030.03Sorts:Sorts:0.610.51Logons:0.010.01Executes:354.34299.23Transactions:1.18%BlockschangedperRead:51.62RecursiveCall%:51.72Rollbackpertransaction%:85.49RowsperSort:########顯示數(shù)據(jù)庫負(fù)載概況,將之與基線數(shù)據(jù)比較才具有更多的意義,如果每秒或每事務(wù)的負(fù)載變化不大,說明應(yīng)用運(yùn)行比較穩(wěn)定。單個(gè)的報(bào)告數(shù)據(jù)只說明應(yīng)用的負(fù)載情況,絕大多數(shù)據(jù)并沒有一個(gè)所謂“正確”的值,然而Logons大于每秒1~2個(gè)、Hardparses大于每秒100、全部parses超過每秒300表明可能有爭用問題。Redosize:每秒產(chǎn)生的日志大小(單位字節(jié)),可標(biāo)志數(shù)據(jù)變更頻率,數(shù)據(jù)庫任務(wù)的繁重與否。Logicalreads:每秒/每事務(wù)邏輯讀的塊數(shù).平?jīng)Q每秒產(chǎn)生的邏輯讀的block數(shù)。LogicalReads=ConsistentGets+DBBlockGetsBlockchanges:每秒/每事務(wù)修改的塊數(shù)Physicalreads:每秒/每事務(wù)物理讀的塊數(shù)Physicalwrites:每秒/每事務(wù)物理寫的塊數(shù)Usercalls:每秒/每事務(wù)用戶call次數(shù)Parses:SQL解析的次數(shù).每秒解析次數(shù),包括fastparse,softparse和hardparse三種數(shù)量的綜合。軟解析每秒超過300次意味著你的"應(yīng)用程序"效率不高,調(diào)整session_cursor_cache。在這里,fastparse指的是直接在PGA中命中的情況(設(shè)置了session_cached_cursors=n);softparse是指在sharedpool中命中的情形;hardparse則是指都不命中的情況。Hardparses:其中硬解析的次數(shù),硬解析太多,說明SQL重用率不高。每秒產(chǎn)生的硬解析次數(shù),每秒超過100次,就可能說明你綁定使用的不好,也可能是共享池設(shè)置不合理。這時(shí)候可以啟用參數(shù)cursor_sharing=similar|force,該參數(shù)默認(rèn)值為exact。但該參數(shù)設(shè)置為similar時(shí),存在bug,可能導(dǎo)致執(zhí)行計(jì)劃的不優(yōu)。Sorts:每秒/每事務(wù)的排序次數(shù)Logons:每秒/每事務(wù)登錄的次數(shù)Executes:每秒/每事務(wù)SQL執(zhí)行次數(shù)Transactions:每秒事務(wù)數(shù).每秒產(chǎn)生的事務(wù)數(shù),反映數(shù)據(jù)庫任務(wù)繁重與否。BlockschangedperRead:表示邏輯讀用于修改數(shù)據(jù)塊的比例.在每一次邏輯讀中更改的塊的百分比。RecursiveCall:遞歸調(diào)用占所有操作的比率.遞歸調(diào)用的百分比,如果有很多PL/SQL,那么這個(gè)值就會(huì)比較高。Rollbackpertransaction:每事務(wù)的回滾率.看回滾率是不是很高,因?yàn)榛貪L很耗資源,如果回滾率過高,可能說明你的數(shù)據(jù)庫經(jīng)歷了太多的無效操作,過多的回滾可能還會(huì)帶來UndoBlock的競爭該參數(shù)計(jì)算公式如下:Round(Userrollbacks/(usercommits+userrollbacks),4)*100%。RowsperSort:每次排序的行數(shù)注:Oracle的硬解析和軟解析提到軟解析(softprase)和硬解析(hardprase),就不能不說一下Oracle對(duì)sql的處理過程。當(dāng)你發(fā)出一條sql語句交付Oracle,在執(zhí)行和獲取結(jié)果前,Oracle對(duì)此sql將進(jìn)行幾個(gè)步驟的處理過程:語法檢查(syntaxcheck)檢查此sql的拼寫是否語法。語義檢查(semanticcheck)諸如檢查sql語句中的訪問對(duì)象是否存在及該用戶是否具備相應(yīng)的權(quán)限。對(duì)sql語句進(jìn)行解析(prase)利用內(nèi)部算法對(duì)sql進(jìn)行解析,生成解析樹(parsetree)及執(zhí)行計(jì)劃(executionplan)。執(zhí)行sql,返回結(jié)果(executeandreturn)其中,軟、硬解析就發(fā)生在第三個(gè)過程里。Oracle利用內(nèi)部的hash算法來取得該sql的hash值,然后在librarycache里查找是否存在該hash值;假設(shè)存在,則將此sql與cache中的進(jìn)行比較;假設(shè)“相同”,就將利用已有的解析樹與執(zhí)行計(jì)劃,而省略了優(yōu)化器的相關(guān)工作。這也就是軟解析的過程。誠然,如果上面的2個(gè)假設(shè)中任有一個(gè)不成立,那么優(yōu)化器都將進(jìn)行創(chuàng)建解析樹、生成執(zhí)行計(jì)劃的動(dòng)作。這個(gè)過程就叫硬解析。創(chuàng)建解析樹、生成執(zhí)行計(jì)劃對(duì)于sql的執(zhí)行來說是開銷昂貴的動(dòng)作,所以,應(yīng)當(dāng)極力避免硬解析,盡量使用軟解析。InstanceEfficiencyPercentages(Target100%)BufferNowait%:BufferNowait%:100.00RedoNoWait%:100.00BufferHit%:98.72In-memorySort%:99.86LibraryHit%:99.97SoftParse%:99.92ExecutetoParse%:89.09LatchHit%:99.99ParseCPUtoParseElapsd%:7.99%Non-ParseCPU:99.95本節(jié)包含了Oracle關(guān)鍵指標(biāo)的內(nèi)存命中率及其它數(shù)據(jù)庫實(shí)例操作的效率。其中BufferHitRatio也稱CacheHitRatio,LibraryHitratio也稱LibraryCacheHitratio。同LoadProfile一節(jié)相同,這一節(jié)也沒有所謂“正確”的值,而只能根據(jù)應(yīng)用的特點(diǎn)判斷是否合適。在一個(gè)使用直接讀執(zhí)行大型并行查詢的DSS環(huán)境,20%的BufferHitRatio是可以接受的,而這個(gè)值對(duì)于一個(gè)OLTP系統(tǒng)是完全不能接受的。根據(jù)Oracle的經(jīng)驗(yàn),對(duì)于OLTP系統(tǒng),BufferHitRatio理想應(yīng)該在90%以上。BufferNowait表示在內(nèi)存獲得數(shù)據(jù)的未等待比例。在緩沖區(qū)中獲取Buffer的未等待比率。BufferNowait的這個(gè)值一般需要大于99%。否則可能存在爭用,可以在后面的等待事件中進(jìn)一步確認(rèn)。bufferhit表示進(jìn)程從內(nèi)存中找到數(shù)據(jù)塊的比率,監(jiān)視這個(gè)值是否發(fā)生重大變化比這個(gè)值本身更重要。對(duì)于一般的OLTP系統(tǒng),如果此值低于80%,應(yīng)該給數(shù)據(jù)庫分配更多的內(nèi)存。數(shù)據(jù)塊在數(shù)據(jù)緩沖區(qū)中的命中率,通常應(yīng)在95%以上。否則,小于95%,需要調(diào)整重要的參數(shù),小于90%可能是要加db_cache_size。一個(gè)高的命中率,不一定代表這個(gè)系統(tǒng)的性能是最優(yōu)的,比如大量的非選擇性的索引被頻繁訪問,就會(huì)造成命中率很高的假相(大量的dbfilesequentialread),但是一個(gè)比較低的命中率,一般就會(huì)對(duì)這個(gè)系統(tǒng)的性能產(chǎn)生影響,需要調(diào)整。命中率的突變,往往是一個(gè)不好的信息。如果命中率突然增大,可以檢查topbuffergetSQL,查看導(dǎo)致大量邏輯讀的語句和索引,如果命中率突然減小,可以檢查topphysicalreadsSQL,檢查產(chǎn)生大量物理讀的語句,主要是那些沒有使用索引或者索引被刪除的。RedoNoWait表示在LOG緩沖區(qū)獲得BUFFER的未等待比例。如果太低(可參考90%閥值),考慮增加LOGBUFFER。當(dāng)redobuffer達(dá)到1M時(shí),就需要寫到redolog文件,所以一般當(dāng)redobuffer設(shè)置超過1M,不太可能存在等待buffer空間分配的情況。當(dāng)前,一般設(shè)置為2M的redobuffer,對(duì)于內(nèi)存總量來說,應(yīng)該不是一個(gè)太大的值。libraryhit表示Oracle從LibraryCache中檢索到一個(gè)解析過的SQL或PL/SQL語句的比率,當(dāng)應(yīng)用程序調(diào)用SQL或存儲(chǔ)過程時(shí),Oracle檢查LibraryCache確定是否存在解析過的版本,如果存在,Oracle立即執(zhí)行語句;如果不存在,Oracle解析此語句,并在LibraryCache中為它分配共享SQL區(qū)。低的libraryhitratio會(huì)導(dǎo)致過多的解析,增加CPU消耗,降低性能。如果libraryhitratio低于90%,可能需要調(diào)大sharedpool區(qū)。STATEMENT在共享區(qū)的命中率,通常應(yīng)該保持在95%以上,否則需要要考慮:加大共享池;使用綁定變量;修改cursor_sharing等參數(shù)。LatchHit:Latch是一種保護(hù)內(nèi)存結(jié)構(gòu)的鎖,可以認(rèn)為是SERVER進(jìn)程獲取訪問內(nèi)存數(shù)據(jù)結(jié)構(gòu)的許可。要確保LatchHit>99%,否則意味著SharedPoollatch爭用,可能由于未共享的SQL,或者LibraryCache太小,可使用綁定變更或調(diào)大SharedPool解決。要確保>99%,否則存在嚴(yán)重的性能問題。當(dāng)該值出現(xiàn)問題的時(shí)候,我們可以借助后面的等待時(shí)間和latch分析來查找解決問題。ParseCPUtoParseElapsd:解析實(shí)際運(yùn)行時(shí)間/(解析實(shí)際運(yùn)行時(shí)間+解析中等待資源時(shí)間),越高越好。計(jì)算公式為:ParseCPUtoParseElapsd%=100*(parsetimecpu/parsetimeelapsed)。即:解析實(shí)際運(yùn)行時(shí)間/(解析實(shí)際運(yùn)行時(shí)間+解析中等待資源時(shí)間)。如果該比率為100%,意味著CPU等待時(shí)間為0,沒有任何等待。Non-ParseCPU:SQL實(shí)際運(yùn)行時(shí)間/(SQL實(shí)際運(yùn)行時(shí)間+SQL解析時(shí)間),太低表示解析消耗時(shí)間過多。計(jì)算公式為:%Non-ParseCPU=round(100*1-PARSE_CPU/TOT_CPU),2)。如果這個(gè)值比較小,表示解析消耗的CPU時(shí)間過多。與PARSE_CPU相比,如果TOT_CPU很高,這個(gè)比值將接近100%,這是很好的,說明計(jì)算機(jī)執(zhí)行的大部分工作是執(zhí)行查詢的工作,而不是分析查詢的工作。ExecutetoParse:是語句執(zhí)行與分析的比例,如果要SQL重用率高,則這個(gè)比例會(huì)很高。該值越高表示一次解析后被重復(fù)執(zhí)行的次數(shù)越多。計(jì)算公式為:ExecutetoParse=100*(1-Parses/Executions)。本例中,差不多每execution5次需要一次parse。所以如果系統(tǒng)Parses>Executions,就可能出現(xiàn)該比率小于0的情況。該值<0通常說明sharedpool設(shè)置或者語句效率存在問題,造成反復(fù)解析,reparse可能較嚴(yán)重,或者是可能同snapshot有關(guān),通常說明數(shù)據(jù)庫性能存在問題。In-memorySort:在內(nèi)存中排序的比率,如果過低說明有大量的排序在臨時(shí)表空間中進(jìn)行??紤]調(diào)大PGA(10g)。如果低于95%,可以通過適當(dāng)調(diào)大初始化參數(shù)PGA_AGGREGATE_TARGET或者SORT_AREA_SIZE來解決,注意這兩個(gè)參數(shù)設(shè)置作用的范圍時(shí)不同的,SORT_AREA_SIZE是針對(duì)每個(gè)session設(shè)置的,PGA_AGGREGATE_TARGET則時(shí)針對(duì)所有的sesion的。SoftParse:軟解析的百分比(softs/softs+hards),近似當(dāng)作sql在共享區(qū)的命中率,太低則需要調(diào)整應(yīng)用使用綁定變量。sql在共享區(qū)的命中率,小于<95%,需要考慮綁定,如果低于80%,那么就可以認(rèn)為sql基本沒有被重用。SharedPoolStatisticsBeginEndMemoryUsage%:47.1947.50%SQLwithexecutions>1:88.4879.81%MemoryforSQLw/exec>1:79.9973.52MemoryUsage%:對(duì)于一個(gè)已經(jīng)運(yùn)行一段時(shí)間的數(shù)據(jù)庫來說,共享池內(nèi)存使用率,應(yīng)該穩(wěn)定在75%-90%間,如果太小,說明SharedPool有浪費(fèi),而如果高于90,說明共享池中有爭用,內(nèi)存不足。這個(gè)數(shù)字應(yīng)該長時(shí)間穩(wěn)定在75%~90%。如果這個(gè)百分比太低,表明共享池設(shè)置過大,帶來額外的管理上的負(fù)擔(dān),從而在某些條件下會(huì)導(dǎo)致性能的下降。如果這個(gè)百分率太高,會(huì)使共享池外部的組件老化,如果SQL語句被再次執(zhí)行,這將使得SQL語句被硬解析。在一個(gè)大小合適的系統(tǒng)中,共享池的使用率將處于75%到略低于90%的范圍內(nèi).SQLwithexecutions>1:執(zhí)行次數(shù)大于1的sql比率,如果此值太小,說明需要在應(yīng)用中更多使用綁定變量,避免過多SQL解析。在一個(gè)趨向于循環(huán)運(yùn)行的系統(tǒng)中,必須認(rèn)真考慮這個(gè)數(shù)字。在這個(gè)循環(huán)系統(tǒng)中,在一天中相對(duì)于另一部分時(shí)間的部分時(shí)間里執(zhí)行了一組不同的SQL語句。在共享池中,在觀察期間將有一組未被執(zhí)行過的SQL語句,這僅僅是因?yàn)橐獔?zhí)行它們的語句在觀察期間沒有運(yùn)行。只有系統(tǒng)連續(xù)運(yùn)行相同的SQL語句組,這個(gè)數(shù)字才會(huì)接近100%。MemoryforSQLw/exec>1:執(zhí)行次數(shù)大于1的SQL消耗內(nèi)存的占比。這是與不頻繁使用的SQL語句相比,頻繁使用的SQL語句消耗內(nèi)存多少的一個(gè)度量。這個(gè)數(shù)字將在總體上與%SQLwithexecutions>1非常接近,除非有某些查詢?nèi)蝿?wù)消耗的內(nèi)存沒有規(guī)律。在穩(wěn)定狀態(tài)下,總體上會(huì)看見隨著時(shí)間的推移大約有75%~85%的共享池被使用。如果Statspack報(bào)表的時(shí)間窗口足夠大到覆蓋所有的周期,執(zhí)行次數(shù)大于一次的SQL語句的百分率應(yīng)該接近于100%。這是一個(gè)受觀察之間持續(xù)時(shí)間影響的統(tǒng)計(jì)數(shù)字??梢云谕S觀察之間的時(shí)間長度增大而增大。小結(jié):通過ORACLE的實(shí)例有效性統(tǒng)計(jì)數(shù)據(jù),我們可以獲得大概的一個(gè)整體印象,然而我們并不能由此來確定數(shù)據(jù)運(yùn)行的性能。當(dāng)前性能問題的確定,我們主要還是依靠下面的等待事件來確認(rèn)。我們可以這樣理解兩部分的內(nèi)容,hit統(tǒng)計(jì)幫助我們發(fā)現(xiàn)和預(yù)測一些系統(tǒng)將要產(chǎn)生的性能問題,由此我們可以做到未雨綢繆。而wait事件,就是表明當(dāng)前數(shù)據(jù)庫已經(jīng)出現(xiàn)了性能問題需要解決,所以是亡羊補(bǔ)牢的性質(zhì)。Top5TimedEventsEventEventWaitsTime(s)AvgWait(ms)%TotalCallTimeWaitClassCPUtime51577.6SQL*Netmoredatafromclient,319276429.7Networklogfileparallelwrite5,4974797.1SystemI/Odbfilesequentialread7,9003545.3UserI/Odbfileparallelwrite4,8063475.1SystemI/O這是報(bào)告概要的最后一節(jié),顯示了系統(tǒng)中最嚴(yán)重的5個(gè)等待,按所占等待時(shí)間的比例倒序列示。當(dāng)我們調(diào)優(yōu)時(shí),總希望觀察到最顯著的效果,因此應(yīng)當(dāng)從這里入手確定我們下一步做什么。例如如果‘bufferbusywait’是較嚴(yán)重的等待事件,我們應(yīng)當(dāng)繼續(xù)研究報(bào)告中BufferWait和File/TablespaceIO區(qū)的內(nèi)容,識(shí)別哪些文件導(dǎo)致了問題。如果最嚴(yán)重的等待事件是I/O事件,我們應(yīng)當(dāng)研究按物理讀排序的SQL語句區(qū)以識(shí)別哪些語句在執(zhí)行大量I/O,并研究Tablespace和I/O區(qū)觀察較慢響應(yīng)時(shí)間的文件。如果有較高的LATCH等待,就需要察看詳細(xì)的LATCH統(tǒng)計(jì)識(shí)別哪些LATCH產(chǎn)生的問題。一個(gè)性能良好的系統(tǒng),cputime應(yīng)該在top5的前面,否則說明你的系統(tǒng)大部分時(shí)間都用在等待上。在這里,logfileparallelwrite是相對(duì)比較多的等待,占用了7%的CPU時(shí)間。通常,在沒有問題的數(shù)據(jù)庫中,CPUtime總是列在第一個(gè)。更多的等待事件,參見本報(bào)告的WaitEvents一節(jié)。RACRACStatisticsBeginEndNumberofInstances:22GlobalCacheLoadProfilePerSecondPerTransactionGlobalCacheblocksreceived:4.163.51GlobalCacheblocksserved:5.975.04GCS/GESmessagesreceived:408.47344.95GCS/GESmessagessent:258.03217.90DBWRFusionwrites:0.050.05EstdInterconnecttraffic(KB)211.16GlobalCacheEfficiencyPercentages(Targetlocal+remote100%)Bufferaccess-localcache%:Bufferaccess-localcache%:98.60Bufferaccess-remotecache%:0.12Bufferaccess-disk%:Bufferaccess-disk%:1.28GlobalCacheandEnqueueServices-WorkloadCharacteristicsAvgglobalenqueuegettime(ms):Avgglobalenqueuegettime(ms):0.1Avgglobalcachecrblockreceivetime(ms):1.1Avgglobalcachecurrentblockreceivetime(ms):0.8Avgglobalcachecrblockbuildtime(ms):0.0Avgglobalcachecrblocksendtime(ms):0.0Globalcachelogflushesforcrblocksserved%:3.5Avgglobalcachecrblockflushtime(ms):3.9Avgglobalcachecurrentblockpintime(ms):0.0Avgglobalcachecurrentblocksendtime(ms):0.0Globalcachelogflushesforcurrentblocksserved%:0.4Avgglobalcachecurrentblockflushtime(ms):3.0GlobalCacheandEnqueueServices-MessagingStatisticsAvgmessagesentqueuetime(ms):0.0Avgmessagesentqueuetime(ms):0.0Avgmessagesentqueuetimeonksxp(ms):0.3Avgmessagereceivedqueuetime(ms):0.5AvgGCSmessageprocesstime(ms):0.0AvgGESmessageprocesstime(ms):0.0%ofdirectsentmessages:14.40%ofindirectsentmessages:77.04%offlowcontrolledmessages:8.56MainReport??WaitEventsStatistics?SQLStatistics?InstanceActivityStatistics?IOStats?BufferPoolStatistics?AdvisoryStatistics?WaitStatistics?UndoStatistics?LatchStatistics?SegmentStatistics?DictionaryCacheStatistics?LibraryCacheStatistics?MemoryStatistics?StreamsStatistics?ResourceLimitStatistics?init.oraParametersWaitEventsStatistics??TimeModelStatistics?WaitClass?WaitEvents?BackgroundWaitEvents?OperatingSystemStatistics?ServiceStatistics?ServiceWaitClassStatsBacktoTop/*oracle等待事件是衡量oracle運(yùn)行狀況的重要依據(jù)及指示,等待事件分為兩類:空閑等待事件和非空閑等待事件,TIMED_STATISTICS=TRUE那么等待事件按等待的時(shí)間排序,=FALSE那么事件按等待的數(shù)量排序。運(yùn)行statspack期間必須session上設(shè)置TIMED_STATISTICS=TRUE,否則統(tǒng)計(jì)的數(shù)據(jù)將失真??臻e等待事件是oracle正等待某種工作,在診斷和優(yōu)化數(shù)據(jù)庫時(shí)候,不用過多注意這部分事件,非空閑等待事件專門針對(duì)oracle的活動(dòng),指數(shù)據(jù)庫任務(wù)或應(yīng)用程序運(yùn)行過程中發(fā)生的等待,這些等待事件是我們?cè)谡{(diào)整數(shù)據(jù)庫應(yīng)該關(guān)注的。對(duì)于常見的等待事件,說明如下:dbfilescatteredread文件分散讀取該事件通常與全表掃描或者fastfullindexscan有關(guān)。因?yàn)槿頀呙枋潜环湃雰?nèi)存中進(jìn)行的進(jìn)行的,通常情況下基于性能的考慮,有時(shí)候也可能是分配不到足夠長的連續(xù)內(nèi)存空間,所以會(huì)將數(shù)據(jù)塊分散(scattered)讀入BufferCache中。該等待過大可能是缺少索引或者沒有合適的索引(可以調(diào)整optimizer_index_cost_adj)。這種情況也可能是正常的,因?yàn)閳?zhí)行全表掃描可能比索引掃描效率更高。當(dāng)系統(tǒng)存在這些等待時(shí),需要通過檢查來確定全表掃描是否必需的來調(diào)整。因?yàn)槿頀呙璞恢糜贚RU(LeastRecentlyUsed,最近最少適用)列表的冷端(coldend),對(duì)于頻繁訪問的較小的數(shù)據(jù)表,可以選擇把他們Cache到內(nèi)存中,以避免反復(fù)讀取。當(dāng)這個(gè)等待事件比較顯著時(shí),可以結(jié)合v$session_longops動(dòng)態(tài)性能視圖來進(jìn)行診斷,該視圖中記錄了長時(shí)間(運(yùn)行時(shí)間超過6秒的)運(yùn)行的事物,可能很多是全表掃描操作(不管怎樣,這部分信息都是值得我們注意的)。關(guān)于參數(shù)OPTIMIZER_INDEX_COST_ADJ=n:該參數(shù)是一個(gè)百分比值,缺省值為100,可以理解為FULLSCANCOST/INDEXSCANCOST。當(dāng)n%*INDEXSCANCOST<FULLSCANCOST時(shí),oracle會(huì)選擇使用索引。在具體設(shè)置的時(shí)候,我們可以根據(jù)具體的語句來調(diào)整該值。如果我們希望某個(gè)statement使用索引,而實(shí)際它確走全表掃描,可以對(duì)比這兩種情況的執(zhí)行計(jì)劃不同的COST,從而設(shè)置一個(gè)更合適的值。dbfilesequentialread文件順序讀取整代碼,特別是表連接:該事件說明在單個(gè)數(shù)據(jù)塊上大量等待,該值過高通常是由于表間連接順序很糟糕(沒有正確選擇驅(qū)動(dòng)行源),或者使用了非選擇性索引。通過將這種等待與statspack報(bào)表中已知其它問題聯(lián)系起來(如效率不高的sql),通過檢查確保索引掃描是必須的,并確保多表連接的連接順序來調(diào)整。bufferbusywait緩沖區(qū)忙增大DB_CACHE_SIZE,加速檢查點(diǎn),調(diào)整代碼:當(dāng)進(jìn)程需要存取SGA中的buffer的時(shí)候,它會(huì)依次執(zhí)行如下步驟的操作:當(dāng)緩沖區(qū)以一種非共享方式或者如正在被讀入到緩沖時(shí),就會(huì)出現(xiàn)該等待。該值不應(yīng)該大于1%。當(dāng)出現(xiàn)等待問題時(shí),可以檢查緩沖等待統(tǒng)計(jì)部分(或V$WAITSTAT),確定該等待發(fā)生在什么位置:如果等待是否位于段頭(SegmentHeader)。這種情況表明段中的空閑列表(freelist)的塊比較少??梢钥紤]增加空閑列表(freelist,對(duì)于Oracle8iDMT)或者增加freelistgroups(在很多時(shí)候這個(gè)調(diào)整是立竿見影的(altertabletablenamestrorage(freelists2)),在8.1.6之前,這個(gè)freelists參數(shù)不能動(dòng)態(tài)修改;在8.1.6及以后版本,動(dòng)態(tài)修改feelists需要設(shè)置COMPATIBLE至少為8.1.6)。也可以增加PCTUSED與PCTFREE之間距離(PCTUSED-to-pctfreegap),其實(shí)就是說降低PCTUSED的值,盡快使塊返回freelist列表被重用。如果支持自動(dòng)段空間管理(ASSM),也可以使用ASSM模式,這是在ORALCE920以后的版本中新增的特性。如果這一等待位于undoheader,可以通過增加回滾段(rollbacksegment)來解決緩沖區(qū)的問題。如果等待位于undoblock上,我們需要增加提交的頻率,使block可以盡快被重用;使用更大的回滾段;降低一致讀所選擇的表中數(shù)據(jù)的密度;增大DB_CACHE_SIZE。如果等待處于datablock,表明出現(xiàn)了hotblock,可以考慮如下方法解決:①將頻繁并發(fā)訪問的表或數(shù)據(jù)移到另一數(shù)據(jù)塊或者進(jìn)行更大范圍的分布(可以增大pctfree值,擴(kuò)大數(shù)據(jù)分布,減少競爭),以避開這個(gè)"熱點(diǎn)"數(shù)據(jù)塊。②也可以減小數(shù)據(jù)塊的大小,從而減少一個(gè)數(shù)據(jù)塊中的數(shù)據(jù)行數(shù),降低數(shù)據(jù)塊的熱度,減小競爭;③檢查對(duì)這些熱塊操作的SQL語句,優(yōu)化語句。④增加hotblock上的initrans值。但注意不要把initrans值設(shè)置的過于高了,通常設(shè)置為5就足夠了。因?yàn)樵黾邮聞?wù)意味著要增加ITL事務(wù)槽,而每個(gè)ITL事務(wù)槽將占用數(shù)據(jù)塊中24個(gè)字節(jié)長度。默認(rèn)情況下,每個(gè)數(shù)據(jù)塊或者索引塊中是ITL槽是2個(gè),在增加initrans的時(shí)候,可以考慮增大數(shù)據(jù)塊所在的表的PCTFREE值,這樣Oracle會(huì)利用PCTFREE部分的空間增加ITLslot數(shù)量,最大達(dá)到maxtrans指定。如果等待處于indexblock,應(yīng)該考慮重建索引、分割索引或使用反向鍵索引。為了防止與數(shù)據(jù)塊相關(guān)的緩沖忙等待,也可以使用較小的塊,在這種情況下,單個(gè)塊中的記錄就較少,所以這個(gè)塊就不是那么"繁忙"?;蛘呖梢栽O(shè)置更大的PCTFREE,使數(shù)據(jù)擴(kuò)大物理分布,減少記錄間的熱點(diǎn)競爭。在執(zhí)行DML(insert/update/delete)時(shí),Oracle向數(shù)據(jù)塊中寫入信息,對(duì)于多事務(wù)并發(fā)訪問的數(shù)據(jù)表,關(guān)于ITL的競爭和等待可能出現(xiàn),為了減少這個(gè)等待,可以增加initrans,使用多個(gè)ITL槽。在Oracle9i中,可以使用ASSM這個(gè)新特性O(shè)racle使用位圖來管理空間使用,減小爭用?!井?dāng)進(jìn)程需要存取SGA中的buffer的時(shí)候,它會(huì)依次執(zhí)行如下步驟的操作:1.獲得cachebufferschainslatch,遍歷那條bufferchain直到找到需要的bufferheader2.根據(jù)需要進(jìn)行的操作類型(讀或?qū)?,它需要在bufferheader上獲得一個(gè)共享或獨(dú)占模式的bufferpin或者bufferlock3.若進(jìn)程獲得bufferheaderpin,它會(huì)釋放獲得的cachebufferschainslatch,然后執(zhí)行對(duì)bufferblock的操作4.若進(jìn)程無法獲得bufferheaderpin,它就會(huì)在bufferbusywaits事件上等待進(jìn)程之所以無法獲得bufferheaderpin,是因?yàn)闉榱吮WC數(shù)據(jù)的一致性,同一時(shí)刻一個(gè)block只能被一個(gè)進(jìn)程pin住進(jìn)行存取,因此當(dāng)一個(gè)進(jìn)程需要存取buffercache中一個(gè)被其他進(jìn)程使用的block的時(shí)候,這個(gè)進(jìn)程就會(huì)產(chǎn)生對(duì)該block的bufferbusywaits事件。截至Oracle9i,bufferbusywaits事件的p1,p2,p3三個(gè)參數(shù)分別是file#,block#和id,分別表示等待的bufferblock所在的文件編號(hào),塊編號(hào)和具體的等待原因編號(hào),到了Oracle10g,前兩個(gè)參數(shù)沒變,第3個(gè)參數(shù)變成了塊類型編號(hào),這一點(diǎn)可以通過查詢v$event_name視圖來進(jìn)行驗(yàn)證:PHPcode:Oracle9iSQL>selectparameter1,parameter2,parameter3fromv$event_namewherename='bufferbusywaits'PARAMETER1PARAMETER2PARAMETER3------------------------------------------------------------------------file#block#idOracle10gPARAMETER1PARAMETER2PARAMETER3------------------------------------------------------------------------file#block#class#在診斷bufferbusywaits事件的過程中,獲取如下信息會(huì)很有用:1.獲取產(chǎn)生bufferbusywaits事件的等待原因編號(hào),這可以通過查詢?cè)撌录膒3參數(shù)值獲得2.獲取產(chǎn)生此事件的SQL語句,可以通過如下的查詢獲得:selectsql_textfromv$sqlt1,v$sessiont2,v$session_waitt3wheret1.address=t2.sql_addressandt1.hash_value=t2.sql_hash_valueandt2.sid=t3.sidandt3.event='bufferbusywaits';3.獲取等待的塊的類型以及所在的segment,可以通過如下查詢獲得:PHPcode:select'SegmentHeader'class,a.segment_type,a.segment_name,a.partition_namefromdba_segmentsa,v$session_waitbwherea.header_file=b.p1anda.header_block=b.p2andb.event='bufferbusywaits'unionselect'FreelistGroups'class,a.segment_type,a.segment_name,a.partition_namefromdba_segmentsa,v$session_waitbwherea.header_file=b.p1andb.p2betweena.header_block+1and(a.header_block+a.freelist_groups)anda.freelist_groups>1andb.event='bufferbusywaits'unionselecta.segment_type||'block'class,a.segment_type,a.segment_name,a.partition_namefromdba_extentsa,v$session_waitbwherea.file_id=b.p1andb.p2betweena.block_idanda.block_id+a.blocks-1andb.event='bufferbusywaits'andnotexists(select1fromdba_segmentswhereheader_file=b.p1andheader_block=b.p2);查詢的第一部分:如果等待的塊類型是segmentheader,那么可以直接拿bufferbusywaits事件的p1和p2參數(shù)去dba_segments視圖中匹配header_file和header_block字段即可找到等待的segment名稱和segment類型,進(jìn)行相應(yīng)調(diào)整查詢的第二部分:如果等待的塊類型是freelistgroups,也可以在dba_segments視圖中找出對(duì)應(yīng)的segment名稱和segment類型,注意這里的參數(shù)p2表示的freelistgroups的位置是在segment的header_block+1到header_block+freelistgroups組數(shù)之間,并且freelistgroups組數(shù)大于1查詢的第三部分:如果等待的塊類型是普通的數(shù)據(jù)塊,那么可以用p1、p2參數(shù)和dba_extents進(jìn)行聯(lián)合查詢得到block所在的segment名稱和segment類型對(duì)于不同的等待塊類型,我們采取不同的處理辦法:1.datasegmentheader:進(jìn)程經(jīng)常性的訪問datasegmentheader通常有兩個(gè)原因:獲取或修改processfreelists信息、擴(kuò)展高水位標(biāo)記,針對(duì)第一種情況,進(jìn)程頻繁訪問processfreelists信息導(dǎo)致freelist爭用,我們可以增大相應(yīng)的segment對(duì)象的存儲(chǔ)參數(shù)freelist或者freelistgroups;若由于數(shù)據(jù)塊頻繁進(jìn)出freelist而導(dǎo)致進(jìn)程經(jīng)常要修改freelist,則可以將pctfree值和pctused值設(shè)置較大的差距,從而避免數(shù)據(jù)塊頻繁進(jìn)出freelist;對(duì)于第二種情況,由于該segment空間消耗很快,而設(shè)置的nextextent過小,導(dǎo)致頻繁擴(kuò)展高水位標(biāo)記,解決的辦法是增大segment對(duì)象的存儲(chǔ)參數(shù)nextextent或者直接在創(chuàng)建表空間的時(shí)候設(shè)置extentsizeuniform2.datablock:某一或某些數(shù)據(jù)塊被多個(gè)進(jìn)程同時(shí)讀寫,成為熱點(diǎn)塊,可以通過如下這些辦法來解決這個(gè)問題:(1)降低程序的并發(fā)度,如果程序中使用了parallel查詢,降低paralleldegree,以免多個(gè)parallelslave同時(shí)訪問同樣的數(shù)據(jù)對(duì)象而形成等待降低性能(2)調(diào)整應(yīng)用程序使之能讀取較少的數(shù)據(jù)塊就能獲取所需的數(shù)據(jù),減少buffergets和physicalreads(3)減少同一個(gè)block中的記錄數(shù),使記錄分布于更多的數(shù)據(jù)塊中,這可以通過若干途徑實(shí)現(xiàn):可以調(diào)整segment對(duì)象的pctfree值,可以將segment重建到blocksize較小的表空間中,還可以用altertableminimizerecords_per_block語句減少每塊中的記錄數(shù)(4)若熱點(diǎn)塊對(duì)象是類似自增id字段的索引,則可以將索引轉(zhuǎn)換為反轉(zhuǎn)索引,打散數(shù)據(jù)分布,分散熱點(diǎn)塊3.undosegmentheader:undosegmentheader爭用是因?yàn)橄到y(tǒng)中undosegment不夠,需要增加足夠的undosegment,根據(jù)undosegment的管理方法,若是手工管理模式,需要修改rollback_segments初始化參數(shù)來增加rollbacksegment,若是自動(dòng)管理模式,可以減小transactions_per_rollback_segment初始化參數(shù)的值來使oracle自動(dòng)增多rollbacksegment的數(shù)量4.undoblock:undoblock爭用是由于應(yīng)用程序中存在對(duì)數(shù)據(jù)的讀和寫同時(shí)進(jìn)行,讀進(jìn)程需要到undosegment中去獲得一致性數(shù)據(jù),解決辦法是錯(cuò)開應(yīng)用程序修改數(shù)據(jù)和大量查詢數(shù)據(jù)的時(shí)間小結(jié):bufferbusywaits事件是oracle等待事件中比較復(fù)雜的一個(gè),其形成原因很多,需要根據(jù)p3參數(shù)對(duì)照Oracle提供的原因代碼表進(jìn)行相應(yīng)的診斷,10g以后則需要根據(jù)等待的block類型結(jié)合引起等待時(shí)間的具體SQL進(jìn)行分析,采取相應(yīng)的調(diào)整措施】4)latchfree:當(dāng)閂鎖丟失率高于0.5%時(shí),需要調(diào)整這個(gè)問題。詳細(xì)的我們?cè)诤竺娴腖atchActivityforDB部分說明。latch是一種低級(jí)排隊(duì)機(jī)制,用于保護(hù)SGA中共享內(nèi)存結(jié)構(gòu)。latch就像是一種快速地被獲取和釋放的內(nèi)存鎖。用于防止共享內(nèi)存結(jié)構(gòu)被多個(gè)用戶同時(shí)訪問。如果latch不可用,就會(huì)記錄latch釋放失敗(latchfreemiss)。有兩種與閂有關(guān)的類型:■立刻。■可以等待。假如一個(gè)進(jìn)程試圖在立刻模式下獲得閂,而該閂已經(jīng)被另外一個(gè)進(jìn)程所持有,如果該閂不能立可用的話,那么該進(jìn)程就不會(huì)為獲得該閂而等待。它將繼續(xù)執(zhí)行另一個(gè)操作。大多數(shù)latch問題都與以下操作相關(guān):沒有很好的是用綁定變量(librarycachelatch)、重作生成問題(redoallocationlatch)、緩沖存儲(chǔ)競爭問題(cachebuffersLRUchain),以及buffercache中的存在"熱點(diǎn)"塊(cachebufferschain)。通常我們說,如果想設(shè)計(jì)一個(gè)失敗的系統(tǒng),不考慮綁定變量,這一個(gè)條件就夠了,對(duì)于異構(gòu)性強(qiáng)的系統(tǒng),不使用綁定變量的后果是極其嚴(yán)重的。另外也有一些latch等待與bug有關(guān),應(yīng)當(dāng)關(guān)注Metalink相關(guān)bug的公布及補(bǔ)丁的發(fā)布。當(dāng)latchmissratios大于0.5%時(shí),就應(yīng)當(dāng)研究這一問題。Oracle的latch機(jī)制是競爭,其處理類似于網(wǎng)絡(luò)里的CSMA/CD,所有用戶進(jìn)程爭奪latch,對(duì)于愿意等待類型(willing-to-wait)的latch,如果一個(gè)進(jìn)程在第一次嘗試中沒有獲得latch,那么它會(huì)等待并且再嘗試一次,如果經(jīng)過_spin_count次爭奪不能獲得latch,然后該進(jìn)程轉(zhuǎn)入睡眠狀態(tài),持續(xù)一段指定長度的時(shí)間,然后再次醒來,按順序重復(fù)以前的步驟.在8i/9i中默認(rèn)值是_spin_count=2000。如果SQL語句不能調(diào)整,在8.1.6版本以上,Oracle提供了一個(gè)新的初始化參數(shù):CURSOR_SHARING可以通過設(shè)置CURSOR_SHARING=force在服務(wù)器端強(qiáng)制綁定變量。設(shè)置該參數(shù)可能會(huì)帶來一定的副作用,對(duì)于Java的程序,有相關(guān)的bug,具體應(yīng)用應(yīng)該關(guān)注Metalink的bug公告。***Latch問題及可能解決辦法------------------------------LibraryCacheandSharedPool(未綁定變量---綁定變量,調(diào)整shared_pool_size)每當(dāng)執(zhí)行SQL或PL/SQL存儲(chǔ)過程,包,函數(shù)和觸發(fā)器時(shí),這個(gè)Latch即被用到.Parse操作中此Latch也會(huì)被頻繁使用.RedoCopy(增大_LOG_SIMULTANEOUS_COPIES參數(shù))重做拷貝Latch用來從PGA向重做日志緩沖區(qū)拷貝重做記錄.RedoAllocation(最小化REDO生成,避免不必要提交)此Latch用來分配重做日志緩沖區(qū)中的空間,可以用NOLOGGING來減緩競爭.RowCacheObjects(增大共享池)數(shù)據(jù)字典競爭.過度parsing.CacheBuffersChains(_DB_BLOCK_HASH_BUCKETS應(yīng)增大或設(shè)為質(zhì)數(shù))"過熱"數(shù)據(jù)塊造成了內(nèi)存緩沖鏈Latch競爭.CacheBuffersLruChain(調(diào)整SQL,設(shè)置DB_BLOCK_LRU_LATCHES,或使用多個(gè)緩沖區(qū)池)掃描全部內(nèi)存緩沖區(qū)塊的LRU(最近最少使用)鏈時(shí)要用到內(nèi)存緩沖區(qū)LRU鏈Latch.太小內(nèi)存緩沖區(qū)、過大的內(nèi)存緩沖區(qū)吞吐量、過多的內(nèi)存中進(jìn)行的排序操作、DBWR速度跟不上工作負(fù)載等會(huì)引起此Latch競爭。5)Enqueue隊(duì)列是一種鎖,保護(hù)一些共享資源,防止并發(fā)的DML操作。隊(duì)列采用FIFO策略,注意latch并不是采用的FIFO機(jī)制。比較常見的有3種類型的隊(duì)列:ST隊(duì)列,HW隊(duì)列,TX4隊(duì)列。STEnqueue的等待主要是在字典管理的表空間中進(jìn)行空間管理和分配時(shí)產(chǎn)生的。解決方法:1)將字典管理的表空間改為本地管理模式2)預(yù)先分配分區(qū)或者將有問題的字典管理的表空間的nextextent設(shè)置大一些。HWEnqueue是用于segment的HWM的。當(dāng)出現(xiàn)這種等待的時(shí)候,可以通過手工分配extents來解決。TX4Enqueue等待是最常見的等待情況。通常有3種情況會(huì)造成這種類型的等待:1)唯一索引中的重復(fù)索引。解決方法:commit或者rollback以釋放隊(duì)列。2)對(duì)同一個(gè)位圖索引段(bitmapindexfragment)有多個(gè)update,因?yàn)橐粋€(gè)bitmapindexfragment可能包含了多個(gè)rowid,所以當(dāng)多個(gè)用戶更新時(shí),可能一個(gè)用戶會(huì)鎖定該段,從而造成等待。解決方法同上。3)有多個(gè)用戶同時(shí)對(duì)一個(gè)數(shù)據(jù)塊作update,當(dāng)然這些DML操作可能是針對(duì)這個(gè)數(shù)據(jù)塊的不同的行,如果此時(shí)沒有空閑的ITL槽,就會(huì)產(chǎn)生一個(gè)block-level鎖。解決方法:增大表的initrans值使創(chuàng)建更多的ITL槽;或者增大表的pctfree值,這樣oracle可以根據(jù)需要在pctfree的空間創(chuàng)建更多的ITL槽;使用smallerblocksize,這樣每個(gè)塊中包含行就比較少,可以減小沖突發(fā)生的機(jī)會(huì)。AWR報(bào)告分析--等待事件-隊(duì)列.docFreeBuffer釋放緩沖區(qū):這個(gè)等待事件表明系統(tǒng)正在等待內(nèi)存中的可用空間,這說明當(dāng)前Buffer中已經(jīng)沒有Free的內(nèi)存空間。如果應(yīng)用設(shè)計(jì)良好,SQL書寫規(guī)范,充分綁定變量,那這種等待可能說明BufferCache設(shè)置的偏小,你可能需要增大DB_CACHE_SIZE。該等待也可能說明DBWR的寫出速度不夠,或者磁盤存在嚴(yán)重的競爭,可以需要考慮增加檢查點(diǎn)、使用更多的DBWR進(jìn)程,或者增加物理磁盤的數(shù)量,分散負(fù)載,平衡IO。Logfilesinglewrite:該事件僅與寫日志文件頭塊相關(guān),通常發(fā)生在增加新的組成員和增進(jìn)序列號(hào)時(shí)。頭塊寫單個(gè)進(jìn)行,因?yàn)轭^塊的部分信息是文件號(hào),每個(gè)文件不同。更新日志文件頭這個(gè)操作在后臺(tái)完成,一般很少出現(xiàn)等待,無需太多關(guān)注。logfileparallelwrite:從logbuffer寫redo記錄到redolog文件,主要指常規(guī)寫操作(相對(duì)于logfilesync)。如果你的Loggroup存在多個(gè)組成員,當(dāng)flushlogbuffer時(shí),寫操作是并行的,這時(shí)候此等待事件可能出現(xiàn)。盡管這個(gè)寫操作并行處理,直到所有I/O操作完成該寫操作才會(huì)完成(如果你的磁盤支持異步IO或者使用IOSLAVE,那么即使只有一個(gè)redologfilemember,也有可能出現(xiàn)此等待)。這個(gè)參數(shù)和logfilesync時(shí)間相比較可以用來衡量logfile的寫入成本。通常稱為同步成本率。改善這個(gè)等待的方法是將redologs放到I/O快的盤中,盡量不使用raid5,確保表空間不是處在熱備模式下,確保redolog和data的數(shù)據(jù)文件位于不同的磁盤中。logfilesync:當(dāng)一個(gè)用戶提交或回滾數(shù)據(jù)時(shí),LGWR將會(huì)話的redo記錄從日志緩沖區(qū)填充到日志文件中,用戶的進(jìn)程必須等待這個(gè)填充工作完成。在每次提交時(shí)都出現(xiàn),如果這個(gè)等待事件影響到數(shù)據(jù)庫性能,那么就需要修改應(yīng)用程序的提交頻率,為減少這個(gè)等待事件,須一次提交更多記錄,或者將重做日志REDOLOG文件訪在不同的物理磁盤上,提高I/O的性能。當(dāng)一個(gè)用戶提交或回滾數(shù)據(jù)時(shí),LGWR將會(huì)話期的重做由日志緩沖器寫入到重做日志中。日志文件同步過程必須等待這一過程成功完成。為了減少這種等待事件,可以嘗試一次提交更多的記錄(頻繁的提交會(huì)帶來更多的系統(tǒng)開銷)。將重做日志置于較快的磁盤上,或者交替使用不同物理磁盤上的重做日志,以降低歸檔對(duì)LGWR的影響。對(duì)于軟RAID,一般來說不要使用RAID5,RAID5對(duì)于頻繁寫入得系統(tǒng)會(huì)帶來較大的性能損失,可以考慮使用文件系統(tǒng)直接輸入/輸出,或者使用裸設(shè)備(rawdevice),這樣可以獲得寫入的性能提高。logbufferspace:日志緩沖區(qū)寫的速度快于LGWR寫REDOFILE的速度,可以增大日志文件大小,增加日志緩沖區(qū)的大小,或者使用更快的磁盤來寫數(shù)據(jù)。當(dāng)你將日志緩沖(logbuffer)產(chǎn)生重做日志的速度比LGWR的寫出速度快,或者是當(dāng)日志切換(logswitch)太慢時(shí),就會(huì)發(fā)生這種等待。這個(gè)等待出現(xiàn)時(shí),通常表明redologbuffer過小,為解決這個(gè)問題,可以考慮增大日志文件的大小,或者增加日志緩沖器的大小。另外一個(gè)可能的原因是磁盤I/O存在瓶頸,可以考慮使用寫入速度更快的磁盤。在允許的條件下設(shè)置可以考慮使用裸設(shè)備來存放日志文件,提高寫入效率。在一般的系統(tǒng)中,最低的標(biāo)準(zhǔn)是,不要把日志文件和數(shù)據(jù)文件存放在一起,因?yàn)橥ǔH罩疚募粚懖蛔x,分離存放可以獲得性能提升。logfileswitch:通常是因?yàn)闅w檔速度不夠快。表示所有的提交(commit)的請(qǐng)求都需要等待"日志文件切換"的完成。LogfileSwitch主要包含兩個(gè)子事件:logfileswitch(archivingneeded)這個(gè)等待事件出現(xiàn)時(shí)通常是因?yàn)槿罩窘M循環(huán)寫滿以后,第一個(gè)日志歸檔尚未完成,出現(xiàn)該等待。出現(xiàn)該等待,可能表示io存在問題。解決辦法:①可以考慮增大日志文件和增加日志組;②移動(dòng)歸檔文件到快速磁盤;③調(diào)整log_archive_max_processes。logfileswitch(checkpointincomplete)當(dāng)日志組都寫完以后,LGWR試圖寫第一個(gè)logfile,如果這時(shí)數(shù)據(jù)庫沒有完成寫出記錄在第一個(gè)logfile中的dirty塊時(shí)(例如第一個(gè)檢查點(diǎn)未完成),該等待事件出現(xiàn)。該等待事件通常表示你的DBWR寫出速度太慢或者IO存在問題。為解決該問題,你可能需要考慮增加額外的DBWR或者增加你的日志組或日志文件大小,或者也可以考慮增加checkpoint的頻率。DBFileParallelWrite:文件被DBWR并行寫時(shí)發(fā)生。解決辦法:改善IO性能。處理此事件時(shí),需要注意dbfileparallelwrite事件只屬于DBWR進(jìn)程。緩慢的DBWR可能影響前臺(tái)進(jìn)程。大量的dbfileparallelwrite等待時(shí)間很可能是I/O問題引起的。(在確認(rèn)os支持異步io的前提下,你可以在系統(tǒng)中檢查disk_asynch_io參數(shù),保證為TRUE??梢酝ㄟ^設(shè)置db_writer_processes來提高DBWR進(jìn)程數(shù)量,當(dāng)然前提是不要超過cpu的數(shù)量。)DBWR進(jìn)程執(zhí)行經(jīng)過SGA的所有數(shù)據(jù)庫寫入,當(dāng)開始寫入時(shí),DBWR進(jìn)程編譯一組臟塊(dirtyblock),并且將系統(tǒng)寫入調(diào)用發(fā)布到操作系統(tǒng)。DBWR進(jìn)程查找在各個(gè)時(shí)間內(nèi)寫入的塊,包括每隔3秒的一次查找,當(dāng)前臺(tái)進(jìn)程提交以清除緩沖區(qū)中的內(nèi)容時(shí):在檢查點(diǎn)處查找,當(dāng)滿足_DB_LARGE_DIRTY_QUEUE、_DB_BLOCK_MAX_DIRTY_TARGET和FAST_START_MTTR_TARGET閥值時(shí),等等。雖然用戶會(huì)話從來沒有經(jīng)歷過dbfileparallelwrite等待事件,但這并不意味著它們不會(huì)受到這種事件的影響。緩慢的DBWR寫入性能可以造成前臺(tái)會(huì)話在writecompletewaits或freebufferwaits事件上等待。DBWR寫入性能可能受到如下方面的影響:I/O操作的類型(同步或異步)、存儲(chǔ)設(shè)備(裸設(shè)備或成熟的文件系統(tǒng))、數(shù)據(jù)庫布局和I/O子系統(tǒng)配置。需要查看的關(guān)鍵數(shù)據(jù)庫統(tǒng)計(jì)是當(dāng)dbfileparallelwrite、freebufferwaits和writecompletewaits等待事件互相關(guān)聯(lián)時(shí),系統(tǒng)范圍內(nèi)的TIME_WAITED和AVERAGE_WAIT。如果dbfileparallelwrite平均等待時(shí)間大于10cs(或者100ms),則通常表明緩慢的I/O吞吐量??梢酝ㄟ^很多方法來改善平均等待時(shí)間。主要的方法是使用正確類型的I/O操作。如果數(shù)據(jù)文件位于裸設(shè)備(rawdevice)上,并且平臺(tái)支持異步I/O,就應(yīng)該使用異步寫入。但是,如果數(shù)據(jù)庫位于文件系統(tǒng)上,則應(yīng)該使用同步寫入和直接I/O(這是操作系統(tǒng)直接I/O)。除了確保正在使用正確類型的I/O操作,還應(yīng)該檢查你的數(shù)據(jù)庫布局并使用常見的命令監(jiān)控來自操作系統(tǒng)的I/O吞吐量。例如sar-d或iostat-dxnC。當(dāng)dbfileparallelwrite平均等待時(shí)間高并且系統(tǒng)繁忙時(shí),用戶會(huì)話可能開始在freebufferwaits事件上等待。這是因?yàn)镈BWR進(jìn)程不能滿足釋放緩沖區(qū)的需求。如果freebufferwaits事件的TIME_WAITED高,則應(yīng)該在高速緩存中增加緩沖區(qū)數(shù)量之前說明DBWRI/O吞吐量的問題。高dbfileparallelwrite平均等待時(shí)間的另一個(gè)反響是在writecompletewaits等待事件上的高TIME_WAITED。前臺(tái)進(jìn)程不允許修改正在傳輸?shù)酱疟P的塊。換句話說,也就是位于DBWR批量寫入中的塊。前臺(tái)的會(huì)話在writecompletewaits等待事件上等待。因此,writecompletewaits事件的出現(xiàn),一定標(biāo)志著緩慢的DBWR進(jìn)程,可以通過改進(jìn)DBWRI/O吞吐量修正這種延遲。DBFileSingleWrite:當(dāng)文件頭或別的單獨(dú)塊被寫入時(shí)發(fā)生,這一等待直到所有的I/O調(diào)用完成。解決辦法:改善IO性能。DBFILEScatteredRead:當(dāng)掃描整個(gè)段來根據(jù)初始化參數(shù)db_file_multiblock_read_count讀取多個(gè)塊時(shí)發(fā)生,因?yàn)閿?shù)據(jù)可能分散在不同的部分,這與分條或分段)相關(guān),因此通常需要多個(gè)分散的讀來讀取所有的數(shù)據(jù)。等待時(shí)間是完成所有I/O調(diào)用的時(shí)間。解決辦法:改善IO性能。這種情況通常顯示與全表掃描相關(guān)的等待。當(dāng)數(shù)據(jù)庫進(jìn)行全表掃時(shí),基于性能的考慮,數(shù)據(jù)會(huì)分散(scattered)讀入BufferCache。如果這個(gè)等待事件比較顯著,可能說明對(duì)于某些全表掃描的表,沒有創(chuàng)建索引或者沒有創(chuàng)建合適的索引,我們可能需要檢查這些數(shù)據(jù)表已確定是否進(jìn)行了正確的設(shè)置。然而這個(gè)等待事件不一定意味著性能低下,在某些條件下Oracle會(huì)主動(dòng)使用全表掃描來替換索引掃描以提高性能,這和訪問的數(shù)據(jù)量有關(guān),在CBO下Oracle會(huì)進(jìn)行更為智能的選擇,在RBO下Oracle更傾向于使用索引。因?yàn)槿頀呙璞恢糜贚RU(LeastRecentlyUsed,最近最少適用)列表的冷端(coldend),對(duì)于頻繁訪問的較小的數(shù)據(jù)表,可以選擇把他們Cache到內(nèi)存中,以避免反復(fù)讀取。當(dāng)這個(gè)等待事件比較顯著時(shí),可以結(jié)合v$session_longops動(dòng)態(tài)性能視圖來進(jìn)行診斷,該視圖中記錄了長時(shí)間(運(yùn)行時(shí)間超過6秒的)運(yùn)行的事物,可能很多是全表掃描操作(不管怎樣,這部分信息都是值得我們注意的)。DBFILESequentialRead:當(dāng)前臺(tái)進(jìn)程對(duì)數(shù)據(jù)文件進(jìn)行常規(guī)讀時(shí)發(fā)生,包括索引查找和別的非整段掃描以及數(shù)據(jù)文件塊丟棄等待。等待時(shí)間是完成所有I/O調(diào)用的時(shí)間。解決辦法:改善IO性能。如果這個(gè)等待事件比較顯著,可能表示在多表連接中,表的連接順序存在問題,沒有正確地使用驅(qū)動(dòng)表;或者可能索引的使用存在問題,并非索引總是最好的選擇。在大多數(shù)情況下,通過索引可以更為快速地獲取記錄,所以對(duì)于編碼規(guī)范、調(diào)整良好的數(shù)據(jù)庫,這個(gè)等待事件很大通常是正常的。有時(shí)候這個(gè)等待過高和存儲(chǔ)分布不連續(xù)、連續(xù)數(shù)據(jù)塊中部分被緩存有關(guān),特別對(duì)于DML頻繁的數(shù)據(jù)表,數(shù)據(jù)以及存儲(chǔ)空間的不連續(xù)可能導(dǎo)致過量的單塊讀,定期的數(shù)據(jù)整理和空間回收有時(shí)候是必須的。需要注意在很多情況下,使用索引并不是最佳的選擇,比如讀取較大表中大量的數(shù)據(jù),全表掃描可能會(huì)明顯快于索引掃描,所以在開發(fā)中就應(yīng)該注意,對(duì)于這樣的查詢應(yīng)該進(jìn)行避免使用索引掃描。DirectPathRead:一般直接路徑讀取是指將數(shù)據(jù)塊直接讀入PGA中。一般用于排序、并行查詢和readahead操作。這個(gè)等待可能是由于I/O造成的。使用異步I/O模式或者限制排序在磁盤上,可能會(huì)降低這里的等待時(shí)間。與直接讀取相關(guān)聯(lián)的等待事件。當(dāng)ORACLE將數(shù)據(jù)塊直接讀入會(huì)話的PGA(進(jìn)程全局區(qū))中,同時(shí)繞過SGA(系統(tǒng)全局區(qū))。PGA中的數(shù)據(jù)并不和其他的會(huì)話共享。即表明,讀入的這部分?jǐn)?shù)據(jù)該會(huì)話獨(dú)自使用,不放于共享的SGA中。在排序操作(orderby/groupby/union/distinct/rollup/合并連接)時(shí),由于PGA中的SORT_AREA_SIZE空間不足,造成需要使用臨時(shí)表空間來保存中間結(jié)果,當(dāng)從臨時(shí)表空間讀入排序結(jié)果時(shí),產(chǎn)生directpathread等待事件。使用HASH連接的SQL語句,將不適合位于內(nèi)存中的散列分區(qū)刷新到臨時(shí)表空間中。為了查明匹配SQL謂詞的行,臨時(shí)表空間中的散列分區(qū)被讀回到內(nèi)存中(目的是為了查明匹配SQL謂詞的行),ORALCE會(huì)話在directpathread等待事件上等待。使用并行掃描的SQL語句也會(huì)影響系統(tǒng)范圍的directpathread等待事件。在并行執(zhí)行過程中,directpathread等待事件與從屬查詢有關(guān),而與父查詢無關(guān),運(yùn)行父查詢的會(huì)話基本上會(huì)在PXDeq:ExecuteReply上等待,從屬查詢會(huì)產(chǎn)生directpathread等待事件。直接讀取可能按照同步或異步的方式執(zhí)行,取決于平臺(tái)和初始化參數(shù)disk_asynch_io參數(shù)的值。使用異步I/O時(shí),系統(tǒng)范圍的等待的事件的統(tǒng)計(jì)可能不準(zhǔn)確,會(huì)造成誤導(dǎo)作用。17)directpathwrite:直接路徑寫該等待發(fā)生在,系統(tǒng)等待確認(rèn)所有未完成的異步I/O都已寫入磁盤。對(duì)于這一寫入等待,我們應(yīng)該找到I/O操作最為頻繁的數(shù)據(jù)文件(如果有過多的排序操作,很有可能就是臨時(shí)文件),分散負(fù)載,加快其寫入操作。如果系統(tǒng)存在過多的磁盤排序,會(huì)導(dǎo)致臨時(shí)表空間操作頻繁,對(duì)于這種情況,可以考慮使用Local管理表空間,分成多個(gè)小文件,寫入不同磁盤或者裸設(shè)備。在DSS系統(tǒng)中,存在大量的directpathread是很正常的,但是在OLTP系統(tǒng)中,通常顯著的直接路徑讀(directpathread)都意味著系統(tǒng)應(yīng)用存在問題,從而導(dǎo)致大量的磁盤排序讀取操作。直接路徑寫(directpahtwrite)通常發(fā)生在Oracle直接從PGA寫數(shù)據(jù)到數(shù)據(jù)文件或臨時(shí)文件,這個(gè)寫操作可以繞過SGA。這類寫入操作通常在以下情況被使用:·直接路徑加載;·并行DML操作;·磁盤排序;·對(duì)未緩存的“LOB”段的寫入,隨后會(huì)記錄為directpathwrite(lob)等待。最為常見的直接路徑寫,多數(shù)因?yàn)榇疟P排序?qū)е?。?duì)于這一寫入等待,我們應(yīng)該找到I/O操作最為頻繁的數(shù)據(jù)文件(如果有過多的排序操作,很有可能就是臨時(shí)文件),分散負(fù)載,加快其寫入操作。18)controlfileparallelwrite:當(dāng)server進(jìn)程更新所有控制文件時(shí),這個(gè)事件可能出現(xiàn)。如果等待很短,可以不用考慮。如果等待時(shí)間較長,檢查存放控制文件的物理磁盤I/O是否存在瓶頸。多個(gè)控制文件是完全相同的拷貝,用于鏡像以提高安全性。對(duì)于業(yè)務(wù)系統(tǒng),多個(gè)控制文件應(yīng)該存放在不同的磁盤上,一般來說三個(gè)是足夠的,如果只有兩個(gè)物理硬盤,那么兩個(gè)控制文件也是可以接受的。在同一個(gè)磁盤上保存多個(gè)控制文件是不具備實(shí)際意義的。減少這個(gè)等待,可以考慮如下方法:①減少控制文件的個(gè)數(shù)(在確保安全的前提下)。②如果系統(tǒng)支持,使用異步IO。③轉(zhuǎn)移控制文件到IO負(fù)擔(dān)輕的物理磁盤。controlfilesequentialreadcontrolfilesinglewrite:控制文件連續(xù)讀/控制文件單個(gè)寫對(duì)單個(gè)控制文件I/O存在問題時(shí),這兩個(gè)事件會(huì)出現(xiàn)。如果等待比較明顯,檢查單個(gè)控制文件,看存放位置是否存在I/O瓶頸。librarycachepin該事件通常是發(fā)生在先有會(huì)話在運(yùn)行PL/SQL,VIEW,TYPES等object時(shí),又有另外的會(huì)話執(zhí)行重新編譯這些object,即先給對(duì)象加上了一個(gè)共享鎖,然后又給它加排它鎖,這

溫馨提示

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

評(píng)論

0/150

提交評(píng)論