What is DB Block Gets,Consistent Gets and Physical Reads?
一、引言:
我们随便执行一条查询语句,并打开autotrace:
1 SQL> set autotrace traceonly; 2 SQL> select * from emp; 3 4 14 rows selected. 5 6 7 Execution Plan 8 ---------------------------------------------------------- 9 Plan hash value: 3956160932 10 11 -------------------------------------------------------------------------- 12 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 13 -------------------------------------------------------------------------- 14 | 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 | 15 | 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 | 16 -------------------------------------------------------------------------- 17 18 Note 19 ----- 20 - dynamic sampling used for this statement (level=2) 21 22 23 Statistics 24 ---------------------------------------------------------- 25 384 recursive calls 26 0 db block gets
27 50 consistent gets 28 3 physical reads 29 0 redo size 30 1454 bytes sent via SQL*Net to client 31 419 bytes received via SQL*Net from client 32 2 SQL*Net roundtrips to/from client 33 4 sorts (memory) 34 0 sorts (disk) 35 14 rows processed
在上面的执行计划中db block gets,consistent gets,physical reads的概念是什么呢?下面我们就开始分别介绍。
二、三者的介绍
2.1、DB Block Gets(当前请求的块数目)
当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。
2.2、Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)
这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询时在这些修改之前调用的,所以需呀对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。
2.3、Physical Reads(物理读)
就是从磁盘上读取数据块的数量,其产生的主要原因是:
1、在数据库高速缓存中不存在这些块;
2、全表扫描;
3、磁盘排序。
2.4、三者的关系
它们三者之间的关系大致可概括为:
逻辑读值的是Oracle从内存读到的数据块数量。一般来说是'Consistent Gets'+'DB Block Gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'Physical Reads‘。