淺談Oracle Buffer Cache的優(yōu)化思路
Buffer Cache
The database buffer cache is the portion of the SGA that holds copies of data blocks read from datafiles. All user processes concurrently connected to the instance share access to the database buffer cache是sga的一部分,用于保持從數(shù)據(jù)文件讀取數(shù)據(jù)塊的副本。所有用戶進(jìn)程共同訪問database buffer cache。
數(shù)據(jù)庫(kù)的讀寫操作應(yīng)盡量在內(nèi)存中完成,減少IO次數(shù)是數(shù)據(jù)庫(kù)性能優(yōu)化的基本策略。
優(yōu)化buffer cache的思路:
1)根據(jù)經(jīng)驗(yàn)設(shè)置db_cache_size參數(shù),例如,db_cache_size=SGA_TARGET*80%。
2)分析AWR報(bào)告中的Buffer Hit值(Instance Efficiency Percentages (Target 100%) )。
需要關(guān)注的等待事件(如果這些等待事件出現(xiàn)在Top-5中,則說明Buffer Cache工作效率不高):
- Latch:cache buffer chains
- Latch:cache buffer LRU chains
- Buffer busy waits
- Read waits
- Free buffer waits
- Latch:cache buffer chains與Latch:cache buffer LRU chains
表示數(shù)據(jù)庫(kù)中存在一些數(shù)據(jù)塊被頻繁讀取,即所謂的熱塊數(shù)據(jù)。如,頻繁讀取的代碼表(?),UNDO頭數(shù)據(jù)(?)、單調(diào)增長(zhǎng)的索引等。
以下可以查詢熱塊數(shù)據(jù):
- select * from (select owner,object_name,object_type,statistic_name,sum(value)
- from v$segment_statistics
- group by owner,object_name,object_type,statistic_name
- order by sum(value) desc)
- where rownum<10;
優(yōu)化方法:如,減少代碼數(shù)據(jù)的讀取次數(shù),使用reverse key索引,以及10g的Global Hash-patition分區(qū)索引等。
Buffer busy waits
表示多個(gè)應(yīng)用在并發(fā)訪問某個(gè)Buffer Cache數(shù)據(jù)塊時(shí)出現(xiàn)等待事件。這種數(shù)據(jù)塊可能是應(yīng)用表或索引,也可能是UNDO(?)、Segment Header(?)等系統(tǒng)數(shù)據(jù)。
以下可以查詢等待事件涉及的對(duì)象:
- select object_name,statistic_name,value
- from v$segment_statistics
- where statistic_name ='buffer busy waits' and value > 2000;
優(yōu)化方法:如,分析是否有全表掃描,索引是否太多,索引單調(diào)增長(zhǎng)等,歸根到底還是分析應(yīng)用。
Read waits
包括:db file sequential read、db file parallel read、db file scattered read。一般而言,只要db file scattered read不是最主要的等待事件,或者所占比例不高,上述事件即使出現(xiàn)在Top-5等待事件中也是正?,F(xiàn)象。
如果這些等待事件非常高,或者所占比例很高。優(yōu)化方法:1,同樣地,首先優(yōu)化應(yīng)用,如是否有太多的全表掃描,索引碎片是否嚴(yán)重。2.適當(dāng)擴(kuò)大db_cache_size。3.分析磁盤I/O效率。
Free buffer waits
表示將Buffer Cache 內(nèi)容寫到磁盤的速度,趕不上其它應(yīng)用申請(qǐng)空閑Buffer Cache的要求。優(yōu)化方法:同樣地,首先優(yōu)化應(yīng)用,如是否有太多的全表掃描,索引效率是否比較高。2.適當(dāng)擴(kuò)大db_cache_size。3.擴(kuò)大db_writer_processes參數(shù),增加DBWn進(jìn)程數(shù)量,加快將Buffer Cache內(nèi)容寫到磁盤的速度。
db_writer_processes默認(rèn)為1或cpu_count/8,默認(rèn)值通常就可以,如果需要設(shè)置db_writer_processes,請(qǐng)不要超過cpu_count,以避免cpu資源無謂消耗。
其它優(yōu)化方法,將表設(shè)計(jì)成cache表,等等。
對(duì)于優(yōu)化,總的來說還是優(yōu)化應(yīng)用。本文就介紹到這里,謝謝!
【編輯推薦】
- MSSQL數(shù)據(jù)庫(kù)跨表和跨數(shù)據(jù)庫(kù)查詢方法簡(jiǎn)介
- SQL Server 2005數(shù)據(jù)庫(kù)用戶權(quán)限管理的設(shè)置
- Oracle跟蹤文件分析工具TKPROF使用簡(jiǎn)介
- 利用mysql的audit審計(jì)功能記錄用戶操作信息
- T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解