Table scan = "read segment header to figure out what block ranges to full scan, then full
scan them"这里提到的”what block ranges to full scan”在查询过程中是可能发生变化的,所以有可能需要用当前(CURRENT)读模式下读到最新的block ranges,然后再去full scan 这些block ranges,此时发生变化的block大概就是segment header
consistent gets:
在一致读模式下所读的块次数,包括从“当前buffer”获得和从“回滚段”读的块次数。(通常是通过不带for update 的select 读的块次数)
db block gets :在当前(CURRENT)读模式下所读的块次数,比较少和特殊,例如数据字典数据获取,另在DML 中更改或删除数据是要用到当前读模式。
(通常是通过update/delete/select for update 读的块次数)
---------------------------------
Consistent gets:
consistent gets 可能需要从回滚段中读到前映(或叫读取一致性影象), 看见的数据是查询开始的时间点的,所以若存在block 在查询开始后发生了变化的情况,则必须产生before p_w_picpath 然后读数据,这就是一致读的含义。查询就是表示 consistent gets (query mode),因为查询要保证所获取的数据的时间点的一致性,所以叫一致读,即使是从当前 buffer 获得的数据,也叫 consistent gets ,这仅仅表达一种模式一种期望,并不表示真实的是从“当前buffer”获得还是从“回滚段”获取数据产生的before p_w_picpath 。db block gets :current mode,不管这个块上的数据是否可能存在 before p_w_picpath ,也就是说不管是否存在回滚中数据可以回滚,只看见当前最新块的数据,即使别人正在更新,也看见别人更新状态的数据,比如dml 的时候就不需要看见别人更改前的数据,而是看见正在更改的,当然同时,若操作相同数据则被lock 住。也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode,个人认为db block gets 这个词用的不好, 容易让人误解. 如果改成inconsistent gets 可能会更准确一些
SQL> select * from TBLTS;
563429 rows selected.
Elapsed: 00:00:52.12
Execution Plan
----------------------------------------------------------
--------------------------------------------------------------------------------
--
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Pstart| Pstop
|
--------------------------------------------------------------------------------
--
| 0 | SELECT STATEMENT | | 554K| 203M| 6371 (2)| |
|
| 1 | PARTITION RANGE ALL| | 554K| 203M| 6371 (2)| 1 | 6
|
| 2 | TABLE ACCESS FULL | TBLTS | 554K| 203M| 6371 (2)| 1 | 6
|
--------------------------------------------------------------------------------
--
Note
-----
- 'PLAN_TABLE' is old version
Statistics
----------------------------------------------------------
2 recursive calls
1 db block gets
64413 consistent gets
28481 physical reads
176 redo size
143030098 bytes sent via SQL*Net to client
413571 bytes received via SQL*Net from client
37563 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
563429 rows processed