關於計算buffer cache hit rate的精確演算法

oracle_ace發表於2008-01-21

在系統執行過程中,如果我們發現Cache hit rate過小,或者我們通過觀察statspack中的Instance Efficiency Percentages這部分呢,我們會發現Buffer Hit%的值很低,通常這就是在暗示你要增加DB_CACHE_SIZE了

1.通常的計算方法

可能大家都知道我們一般都是通過以下的公式來計算我們的buffer hit%的
Cache hit rate=((consistent_gets + db_block_gets) - physical_reads) /
(consistent_gets + db_block_gets)

2.進一步更精確的結果,我們需要考慮direct reads

如果Buffer hit%為85%,那麼如果只是這樣簡單的按照上面的公式,計算得到85%的命中率,並不意味著miss rate=15%,因為15%中包括我們通常所說的direct reads。

direct reads一般發生在parallel scans和 reads from temporary tablespaces等情況下。blocks被直接讀入私有PGA中的buffer,而沒有經過SGA中的buffer cache.所以我們不應該把其算入內.

所以,如果我們通過查詢v$sysstat來計算buffer hit%,可以去掉direct物理讀部分,這樣更新後的公式就是
Buffer hit = 1 - ((physical reads - physical reads direct - physical reads direct (lob)) /
(db block gets + consistent gets - physical reads direct - physical reads direct (lob))

另外,v$sysstat中的consistent_gets的值也有所誇大,可以累加以下4項得到:
no work - consistent read gets
cleanouts only - consistent read gets
rollbacks only - consistent read gets
cleanouts and rollbacks - consistent read gets

其實最好的方法是直接訪問V$BUFFER_POOL_STATISTICS而不是v$sysstat,其中的資料都是排除了direct reads的結果。
比如
V$BUFFER_POOL_STATISTICS.physical_reads=v$sysstat 的'physical reads'- 'physical reads direct'- 'physical reads direct (lob)'

這樣可以直接執行下面的語句來計算我們的Buffer Hit%:
select name, ((consistent_gets + db_block_gets) - physical_reads) /
(consistent_gets + db_block_gets) * 100 "Hit Ratio%"
from v$buffer_pool_statistics
where physical_reads > 0;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-154924/,如需轉載,請註明出處,否則將追究法律責任。

相關文章