consistentgets :consistent_gets是從回滾段中讀到的前映(或叫讀取一致性影象),看見的數據是查詢開始的時間點的,所以若存在block在查詢開始後發生了變化的情況,則必須產生 before image然後讀數據,這就是一致讀的含義
查詢就是表示 consistent gets (querymode),因爲查詢要保證所獲取的數據的時間點的一致性,所以叫一致讀,即使是從當前 buffer 獲得的數據,也叫consistent gets ,這僅僅表達一種模式一種期望,並不表示真實的是從 當前buffer 獲得 還是從回滾段獲取數據產生的bufore image 。
db blockgets : current mode ,不管這個塊上的數據是否可能存在 before image ,也就是說不管是否存在回滾中數據可以回滾,只看見當前最新塊的數據,即使別人正在更新,也看見別人更新狀態的數據,比如dml的時候就不需要看見別人更改前的數據,而是看見正在更改的,當然同時,若操作相同數據則被lock住。也就是說一次查詢中看見的數據可能不在同一個時間點上,比如一個大的dml,當dml開始更新一個非常大的表後,這個表更新的過程中,有一個進程去把該表末尾的一個記錄更新了,然後這個大更新抵達該記錄的時候會被阻塞的,若該進程事物提交,則大更新會覆蓋該事務的更新,也就是說,這個大更新所看見的數據是當前的,不具有時間點的一致性,所以叫current
mode,個人認爲db block gets這個詞用的不好, 容易讓人誤解. 如果改成inconsistentgets可能會更準確一些。
SQL> alter system flush buffer_cache;
系統已更改。
SQL> set autot
用法: SET AUTOT[RACE] {OFF | ON |TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
SQL> set autot traceonly stat
SQL> select * from t;
已選擇798945行。
統計信息
----------------------------------------------------------
1 recursive calls
0 db block gets --這個爲0
63677 consistentgets
11118 physicalreads
0 redo size
85740332 bytes sent via SQL*Netto client
586267 bytes received viaSQL*Net from client
53264 SQL*Net roundtripsto/from client
0 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
SQL> select * from t;
已選擇798945行。
統計信息
----------------------------------------------------------
0 recursive calls
0 db block gets
69587 consistent gets --全是一致性得到,因爲已經在Buffer_cache中
0 physical reads
0 redo size
85740332 bytes sent via SQL*Netto client
586267 bytes received viaSQL*Net from client
53264 SQL*Net roundtripsto/from client
0 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
SQL> select * from t for update;
已選擇798945行。
統計信息
----------------------------------------------------------
476 recursive calls
812439 db block gets --更新時,產生這個
884932 consistentgets
5 physical reads
160912940 redo size
73057198 bytes sent via SQL*Netto client
586267 bytes received viaSQL*Net from client
53264 SQL*Net roundtripsto/from client
0 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
SQL> rollback;
回退已完成。
SQL> alter system flush buffer_cache;
系統已更改。
SQL> select * from t for update;
已選擇798945行。
統計信息
----------------------------------------------------------
476 recursive calls
812437 db block gets
884836 consistentgets
11122 physicalreads
160903012 redo size
73057198 bytes sent via SQL*Netto client
586267 bytes received viaSQL*Net from client
53264 SQL*Net roundtripsto/from client
0 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
SQL> alter system flush buffer_cache;
系統已更改。
SQL> desc t;
名稱 是否爲空?類型
------------------------------------------------- ---------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> update t set owner='a';
已更新798945行。
統計信息
----------------------------------------------------------
4564 recursive calls
7008787 db block gets
1123165 consistent gets
13434 physicalreads
555747124 redo size
683 bytessent via SQL*Net to client
558 bytesreceived via SQL*Net from client
4 SQL*Net roundtrips to/from client
16 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
SQL> select * from t;
已選擇798945行。
統計信息
----------------------------------------------------------
1 recursive calls
0 db block gets
63677 consistentgets
0 physical reads
0 redo size
82886810 bytes sent via SQL*Netto client
586267 bytes received viaSQL*Net from client
53264 SQL*Net roundtripsto/from client
0 sorts (memory)
0 sorts (disk)
798945 rowsprocessed
可以理解 爲:
consistent gets : 是由 查詢語句產生的,不管所查的數據是否需要構造前鏡像,都要算進去
db block gets: 是由update,delete,select for update 產生的