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