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