DB Block Gets、Consistent Gets、Physical Reads
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'。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- recursive calls, db block gets,consistent gets,physical ReadsBloC
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解BloC
- Consistent Gets,Physical Reads和DB Block Gets的解釋(轉)BloC
- (轉)關於 db block gets,consistent gets,physical reads的概念BloC
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解和解釋BloC
- DB Bocks gets,Consistent gets And Physical reads 轉載
- 關於統計中Consistent Gets,Physical Reads和DB Block Gets的意義BloC
- 【Oracle-記憶體管理】-DB Blocks gets,Consistent gets And Physical readsOracle記憶體BloC
- oracle buffer gets=db block gets+consistent getsOracleBloC
- db block gets 與 consistent read getsBloC
- Consistent Gets(就是logical read)+ DB Block Gets = 所謂的Logical ReadsBloC
- recursive calls ,db block gets , consistent gets的含義BloC
- consistent gets、db block gets的簡單精闢的理解BloC
- DB Bocks gets & Consistent gets 區別
- consistent gets
- 關於執行計劃裡recursive calls,db block gets和consistent gets引數的解釋BloC
- db block gets的解釋[轉]BloC
- consistent gets 到底指的是什麼?
- 淺談consistent gets的計算
- consistent gets暴漲的一種情況
- sqlplus中arrayseize引數以及consistent getsSQL
- oracle實驗記錄 (oracle consistent gets 計算)Oracle
- [20111229]Consistent gets from cache (fastpath).txtAST
- db block get和consistent read getBloC
- Oracle透過AWR的SQL ordered by Gets和SQL ordered by Reads診斷問題OracleSQL
- [20111228]理解consistent gets*相關資訊
- [20111229]理解consistent gets*相關資訊[補充]
- gets函式的漏洞函式
- C語言關於指標,gets()和gets_s()函式的理解C語言指標函式
- AIX: Database performance gets slower the longer the db is running_316533.1AIDatabaseORM
- Your Prediction Gets As Good As Your DataGo
- Why Archive, FRA Diskgroup Gets Mounted / DismountedHive
- 行欲取導致sqlplus中trace的consistent gets遠大於實際塊數SQL
- getc();fgetc();getchar();gets();fgets();
- gets函式的不安性詳解函式
- Database performance gets slower the longer the database is runningDatabaseORM
- OPatch failed with error code 73(OracleHomeInventory gets null oracleHomeInfo)AIErrorOracleNull
- Oracle一致性讀(consistents gets)Oracle