DB Block Gets、Consistent Gets、Physical Reads

lusklusklusk發表於2017-01-06
db block gets:Number of times a CURRENT block was requested.
consistent gets:Number of times a consistent read was requested for a block.
physical reads:Total number of data blocks read from disk. This number equals the value of "physical reads direct" plus all reads into buffer cache.
---------------------------------------------------------------------------------------------------------------------

針對以上3個概念進行的說明解釋及關係如下:

1、DB Block Gets(當前請求塊的讀取次數,單位是塊/次,DML才會產生
current mode
當前塊就是在查詢開始的那個時間點上存在的資料塊,而不是在這個時間點之前或者之後的資料塊數目。
以當前讀到塊的時間為基準,主要是DML操作(U,I,D),即使資料在DML操作開始時的SCN之後被提交的,也會一直等這個提交完成

current mode就是當看到當前的block中的內容的時候,是什麼就是什麼,跟時間點無關,不用去回滾段獲取之前的資料。主要就是發生在DML 的時候,當發生DML的時候,session所看見的必須是當前的block的狀態,不能去回滾段獲取資料。假如當前block中資料是被其他的session更改過還沒有提交,那麼則看到當前狀態資料被其他session 鎖定,出現等待。(而查詢去回滾段獲取資料則讀和更新之間不會出現鎖的情況)

也就是說一次查詢中看見的資料可能不在同一個時間點上,比如一個大的dml,當dml 開始更新一個非常大的表後,這個表更新的過程中,有一個程式去把該表末尾的一個記錄更新了,然後這個大更新抵達該記錄的時候會被阻塞的,若該程式事物提交,則大更新會覆蓋該事務的更新,也就是說,這個大更新所看見的資料是當前的,不具有時間點的一致性,所以叫 current mode。資料字典的讀也是 current mode.


2、Consistent Gets(一致性讀所需要的資料塊的讀取次數,單位是塊/次,select才會產生
consistent mode 
一致性讀塊就是在查詢開始的那個時間點的資料塊+這個時間點以前存在的已提交的資料塊。
也就是說,當查詢開始的時候oracle將確立一個時間點,凡是在這個時間點以前提交的資料oracle將能看見,之後提交的資料將不能看見。但查詢的時候可能遇上這樣的情況,該塊中資料已經被修改了,沒有提交,或者提交的時間點比查詢開始的時間晚,則oracle為了保證讀的一致性,需要去回滾段獲取該塊中變化前的資料。這叫 consistent reads 。

比如你查詢的過程中,由於其他會話對資料塊進行操作,而對所要查詢的塊有了修改,但是由於我們的查詢是在這些修改之前呼叫的,所以需要對回滾段中的資料塊的前映像進行查詢,以保證資料的一致性。其中可能包括undo block,也有包括非undo block,而非undo block則就是buffer cache block。

讀取一個資料塊,則這個資料塊要麼直接來自datafile,要麼來自Buffer Cache,如果來自datafile,則也要讀取到SGA的Buffer Cache中,也就是一次物理讀必然產生一個邏輯讀的意思資料塊上都會有最後一次修改資料塊後commit的SCN
如果一個事務需要修改資料塊中資料,會先在回滾段中儲存一份修改前資料和SCN,然後再更新Buffer Cache中的資料塊的資料,如果沒有commit則標記段頭部的TIL,如果已經commit則把commit後的SCN更新到資料塊上。當其他程式讀取資料塊時,會先比較資料塊上的SCN和自己的SCN。如果資料塊上的SCN 小於等於程式本身的SCN,則直接讀取資料塊上的資料;如果資料塊上的SCN大於程式本身的SCN,則會從回滾段中找出修改前的資料塊讀取資料。
Oracle的一致性讀的理解:一個語句在讀取資料快時,如果發現這個資料塊是在它讀取的過程中被修改的(資料塊上的SCN 大於等於讀取程式本身的SCN),就不直接從資料塊上讀取資料,而是從相應的undo中讀取資料。這就保證了最終結果應該是讀操作開始時的那一時刻的快照 (snapshot),而不會受到讀期間其他事務的影響。當然如果放在undo裡面的資料被覆蓋了,就報錯OR會A-01555:快照過舊

經過初步試驗,發現如果開始執行select * from emp後,然後再執行select * from emp where empno = 7902, 不管執行多少此,都不會引起physical reads與db block gets的增加。


邏輯讀(consistent gets+db block gets)和每批次處理的資料行的大小是有一定關係的。每批次處理的資料行越大,則邏輯讀越小。所以減少邏輯讀的一個方法就是增加arraysize


3、Physical Reads(物理讀)
就是從磁碟上讀取資料塊的數量,其產生的主要原因是:
1、 在資料庫快取記憶體中不存在這些塊
2、 全表掃描
3、 磁碟排序



它們三者之間的關係大致可概括為:
邏輯讀指的是Oracle從記憶體讀到的資料塊數量。一般來說是'consistent gets' + 'db block gets'。當在記憶體中找不到所需的資料塊的話就需要從磁碟中獲取,於是就產生了'phsical reads'。

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

相關文章