查看 buffer cache 命中率


SQL> select name,value from v$sysstat where name in('db block gets','consistent gets','physical reads');

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
db block gets                                                           932
consistent gets                                                       50535
physical reads                                                         9145

命中率計算公式

Hit Radio=1-physical reads/(db block gets+consistent gets)

 

SQL> select (1-9145/(50535+932)) from dual;

(1-9145/(50535+932))
--------------------
          .822313327
SQL> show parameter db_block_buffers

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_buffers                     integer     0

由於10G中引入了SGA自動管理,所以show parameter 查出來的db_block_buffers爲 0

查看當前buffer cache size

SQL> select name ,bytes/1024/1024 Mb from v$sgainfo where name ='Buffer Cache Size';

NAME                                     MB
-------------------------------- ----------
Buffer Cache Size                       288    這個buffer cache size 指的是 default + keep +recycle 的和

SQL> select current_size from v$buffer_pool;

CURRENT_SIZE
------------
         288         這裏 我沒有配置 keep pool ,也沒有配置 recycle pool

如果一個長期運行的database 長期的 Hit Radio<90%,那麼就應該考慮多分配點內存給buffer cache ,同時增加物理內存,或者SQL調優

理想的hit radio 應該在 95%以上

 

 

select "db block gets","consistent gets","physical reads",

round(1-"physical reads"/("db block gets"+"consistent gets"),2) as hit

from(

     SELECT max(decode(name,'db block gets',value,null)) as "db block gets",

                   max(decode(name,'consistent gets',value,null)) as "consistent gets",

                   max(decode(name,'physical reads',value,null)) as "physical reads"

    FROM v$sysstat

    WHERE name IN ('db block gets', 'consistent gets','physical reads')

);


若hit 小於98%,考慮增大buffer cache。若小於90%,則已經命中率很低了,考慮調優。

DB BUFFER CACHE 命中率介紹

1. 塊緩存即數據高速緩衝區。它是SGA區的一個主要部分。用於存放從數據文件讀入的數據塊。它的大小有INITsid.ORA文件的DB_BLOCK_BUFFERS參數來設置(Oracle9i參數名稱爲DB_CACHE_SIZE)。這個區內容再分爲:

l Dirty Buffers 已經改變但還沒有存盤的緩衝區。

l Pinned Buffers 當前正在訪問的緩衝區。

l Free Buffers 當前尚未使用的緩衝區。

2. 數據高速緩衝區也有命中率的問題。如果需要的數據能在數據高速緩衝區中找到。就叫命中。下面語句查詢命中率相關幾個參數值的信息。

select name, value from v$sysstat where name in (‘consistent gets’,’db block gets’,’physical reads’ ) ;

3. 下面要具體介紹一下具體的參數。

官網的:

DB block gets:the number of accesses to the current image of a block
Consistent gets:the number of accesses to a read-consistent image of a block
Physical reads:the number of blocks read from disk

這其中主要涉及到了Oracle讀取數據的consistent mode和current mode這兩個模式,對於db block gets是在current mode下讀取的block數目(單位應該是“塊次”,同一個block讀取了兩個算做2),而consistent gets是在consistent mode下讀取的block數目(單位同上)。

current mode下讀取數據是爲了保證讀取到的數據是當前時間點上最新的數據,這樣做的目的一般都是爲了DML語句的需求,比如需要更新,自然需要知道最新的數據才行;consistent mode呢主要是爲了保證Oracle數據一致讀的特性,一般都是在select情況下發生,讀到的數據可能是一個實際存在的block,也有可能需要根據scn信息以及transaction相關信息以及回滾段中數據來構造。

而physical reads是與logical reads相對的一個概念,兩者的區別是讀取的數據是從buffer中讀取到還是從disk上的db file中取到。通過v$sysstat也可以看到,裏面還有db block gets from cache以及consistent gets from cache兩項,且這兩項的數值與db block gets和consistent gets並不相同且小於後兩者。所以不管是db block gets還是consistent gets,都可能出現了physical reads和logical reads兩種情況(由buffer中的是否已經存在需要的數據),也即是說,db block gets與consistent gets兩者已經構成了一次數據庫操作中讀取的所有block的總次數了。因此,logical reads自然也就可以通過如下公式算的:logical reads = (db block gets + consistent gets) - physical reads。

由此,自然也就得出了cache命中率的公式:
Hit Ratio = (db block gets + consistent gets - physical reads) / (db block gets + consistent gets)
OR
Hit Ratio = 1 – (physical reads/(db block gets + consistent gets))

PS:
由於在Oracle中,取數據最後都是從Buffer中取,所以每出現一個physical reads必然會出現一次 logical reads,但是這裏有一個需要注意的地方,就是當出現一個physical reads後接着會有一個logical reads這裏,實際上這裏只算了1 block(physical reads)!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章