oracle sql 高级编程学习笔记(六)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whandgdh/article/details/82011899

一、Consistent Gets

Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)概念是指在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操 作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。
consistent gets在判断一段SQL的性能时非常有用,通常来讲比较两段SQL的性能好坏不是看谁的执行时间短,而是看谁的consistent gets小。不过这也不是绝对的,下面这个例子就是一个反例:

--创建T1表
create table  t1 as
select  trunc((rownum-1)/100) id,rpad(rownum,100) t_pad from  dba_source t
where rownum<=10000;
--创建索引
create index t1_idx1 on t1(id);
select * from t1; //查看t1的执行计划

这里写图片描述

select * from t1 order by id;

这里写图片描述
第一个sql的性能肯定是比第二个sql 性能好,
但是第二个sql的consitent gets只有156个,而第一个sql的有843个;
原因如下:
一:通常情况下,不在logical RAM buffer中的数据要通过physical reads来读取,而physical reads后通常会紧跟着一个consistent gets。因此一般情况下consistent gets是要比physical reads大的。但是有一个特例,如果physical reads得到的数据直接用于HASH或者SORT,则只记为physical reads不记为consistent gets。所以加上order by后有可能physical reads多但consistent gets少。但这不是本例原因,本列不涉及到物理读取。
二:arraysize的影响。arraysize是指读取数据时一次读取得到的行数。这个值默认为15,使用show arraysize命令可以查看。本例中数据块有10000条记录,那么并不是读取这个块一次就能取到所有数据,以arraysize=15为例,就要有10000/15=667 次consistent gets。把arraysize设置得大一点可以降低consistent gets,不过有时候可能会消耗更多的资源。如果我们做select count(1) from t1;操作以及 select * from t1 order by id; ,那么Oracle会把arraysize暂时设为t1的行数,即10000,因此consistent gets会很少。
实际 consistent gets计算公式=rows/arraysize+usedblock;

--获取usedblock
select  table_name,num_rows,blocks  from  user_tables t  where t.table_name='T1';

这里写图片描述
数据行10000
arraysize 15
rows/arraysize= 1w/15=667
usedblock =152;
consistent gets=667+152=819 这个值跟实际sql1 中843已经很接近了,因为全表扫描时表的数据块不会被全部读进内存,这样计算出来的值跟一致性读的值就更吻合了。

对于第二个sql
我们看如下sql的执行计划
select count(1) from t1;
这里写图片描述

可以看到两个sql的consistent次数都是156次,这就是上面所说的原因2,Oracle把arraysize临时设为t1表的行数,它把所有数据先全部取出来放到sort区做排序,而在sort区的读取就不算在consistent gets里了。当然第二个sql的效率也是比第三个sql效率低,第三个sql的cost是43。而第二个的是283.注意第一个的cost也是43,但成本相同不一定效率也相同。

二、DB Block Gets

(当前请求的块数目)当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。

三、Physical Reads(物理读取)

就是从磁盘上读取数据块的数量,其产生的主要原因是:
1、 在数据库高速缓存中不存在这些块 2、 全表扫描 3、 磁盘排序

它们三者之间的关系大致可概括为:逻辑读指的是Oracle从内存读到的数据块数量。
一般来说是’consistent gets’ + ‘db block gets’。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了’phsical reads’。

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/82011899