執行計劃之:consistent gets ,db block gets

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 產生的

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