DB Bocks gets,Consistent gets And Physical reads 轉載

fengyaping1210發表於2009-06-24

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
97 consistent gets
0 physical reads
0 redo size
26360 bytes sent via SQL*Net to client
554 bytes received via SQL*Net from client
16 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
219 rows processed
自己測試了一個SQL

轉載一些概念

官方線上文件基本的定義為如下:
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)!

buffer cache的統計資訊

為了對buffer cache進行效能的診斷,oracle提供了很多有關buffer cache的統計資訊。這些統計資訊大致可以分成三類:1)有關使用者發出的對記憶體資料塊的請求相關的統計資訊;2)有關DBWR後臺程式對記憶體資料塊處理相關的統計資訊;3)RAC相關的統計資訊。

我們在診斷buffer cache時,不需要關注所有的統計資訊。這裡主要介紹幾個重要的統計資訊,其他的統計資訊都可以到《Oracle9i Database Reference: Appendix C》中找到。如下所示:




SQL> SELECT name, value FROM v$sysstat WHERE name in (
2 'session logical reads',
3 'physical reads',
4 'physical reads direct',
5 'physical reads direct (lob) ',
6 'consistent gets',
7 'db block gets',
8 'free buffer inspected')
9 /
NAME VALUE
---------------------------------------------------------------- ----------
session logical reads 73797
db block gets 498
consistent gets 73299
physical reads 29017
free buffer inspected 0
physical reads direct 40


這裡做些簡單的解釋。
1) session logical reads:所有的邏輯讀的資料塊的數量。注意,其中包括先從硬碟上讀資料塊到記憶體裡,再從記憶體裡讀資料塊。
2) consistent gets:在一致性(consistent read)讀模式下讀取的記憶體裡的資料塊數量。包括從rollback segment裡讀取的資料塊數量以及從data block buffer裡讀取的資料塊數量。主要是透過select產生的。Update/delete也能產生很少量的此類資料塊。注意:如果oracle的執行時間過長,由於oracle的bug導致consistent gets大大超過實際的數量。因此建議使用‘no work - consistent read gets’, ‘cleanouts only - consistent read gets’,‘rollbacks only - consistent read gets’, ‘cleanouts and rollbacks - consistent read gets’之和來代替consistent gets的值。
3) db block gets:在當前(current)模式下讀取的記憶體裡的資料塊的數量。不是讀取過去某個時點的資料塊,而必須是當前最新的資料塊。主要是透過update/delete/insert來產生的,因為DML需要當前最新的資料塊才能對之進行改變。在字典管理表空間下,一些獲得當前可用擴充套件空間的select語句也會產生此類資料塊,因為必須得到當前最新的空間使用資訊才能擴充套件。邏輯上,session logical reads = consistent gets + db block gets。
4) physical reads:從硬碟裡讀取的資料塊的數量。注意,這個數量大於實際從硬碟裡讀取的數量,因為這部分block也包括了從作業系統快取裡讀取的資料塊數量。
5) physical reads direct:有些資料塊不會先從硬碟讀入記憶體再從記憶體讀入PGA再傳給使用者,而是繞過SGA直接從硬碟讀入PGA。比如並行查詢以及從臨時表空間讀取資料。這部分資料塊由於不快取使得hit ratio不會被提高。
6) physical reads direct (lob):與physical reads direct一樣。
7) free buffer inspected:這個值表示為了找到可用資料塊而跳過的資料塊的數量。這些被跳過的資料塊就是髒的或被鎖定的資料塊。明顯,這個值如果持續增長或很高,就需要增加buffer cache的大小了。

在獲得了這些統計資訊以後,我們可以計算buffer cache的命中率:



1Hit Ratio = 1 – (physical reads – physical reads direct
- physical reads direct (lob) ) / session logical reads
2Miss ratio = (physical reads – physical reads direct-
physical reads direct (lob) ) / session logical reads





通常在OLTP下,hit ratio應該高於0.9。否則如果低於0.9則需要增加buffer cache的大小。在考慮
調整buffer cache hit ratio時,需要注意以下幾點。
1) 如果上次增加buffer cache的大小以後,沒有對提高hit ratio產生很大效果的話,不要盲目增加buffer cache的大小以提高效能。因為對於排序操作或並行讀,oracle是繞過buffer cache進行的。
2) 在調整buffer cache時,儘量避免增加很多的記憶體而只是提高少量hit ratio的情況出現。
我們還可以查詢每種buffer cache的統計資訊,主要關注的還是consistent_gets和db_block_gets以及
physical_reads的值。

[@more@]DB Bocks gets,Consistent gets And Physical reads

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

相關文章