在Oracle中使用consistent gets的特例

Oracle数据库中,consistent gets在判断一段SQL的性能时非常有用,通常来讲比较两段SQL的性

能好坏不是看谁的执行时间短,而是看谁的consistent gets小。不过这也不是绝对的,下面这个例子

就是一个反例。

一:通常情况下,不在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少。

不过这个原因不是我这里现象产生的原因,因为我这个实验里根本没有physical reads.

二:arraysize的影响。arraysize是指读取数据时一次读取得到的行数。这个值默认为15,使用

show arraysize命令可以查看。一个数据块例如有100条记录,那么并不是读取这个块一次就能取到所

有数据,以arraysize=15为例,就要有 100/15=7次consistent gets.把arraysize设置得大一点可以

降低consistent gets,不过有时候可能会消耗更多的资源。如果我们做select count(0) from

test;操作,那么Oracle DBA会把arraysize暂时设为test的行数,因此consistent gets会很少:

代码如下:

ETL@RACTEST> select count(0) from test; Elapsed: 00:00:00.00 Execution Plan Plan

hash value: 1950795681 --------------

| Id | Operation

| Name | Rows | Cost (%CPU)| Time

| | 0 | SELECT STATEMENT |

| 1 |

6 (0)| 00:00:01 | | 1 | SORT AGGREGATE |

| 1 |

| |

| 2 | TABLE ACCESS FULL| TEST | 10000 |

6 (0)| 00:00:01 | -----------------------------------------------------------------

-- Note

- dynamic sampling used for this statement Statistics

0 recursive calls

0 db block gets

23 consistent gets

0 physical reads

0 redo size

515 bytes sent via SQL*Net to client

465 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

可以看到select count(0)只需要23个逻辑读。一共10000条数据,10000/15=666.667 ,好,

667+23=690!和第1个SQL的consistent gets竟然惊人的一致!这不是巧合,这就是consistent gets的

计算公式。我们还可以发现select count(0)和第2个SQL的consistent gets竟然也惊人地一致,都

是23!

TOM的解释是:

在select * from test order by 1;时,Oracle也把arraysize临时设为test表的行数,它把所有

数据先全部取出来放到sort区做排序,而在sort区的读取就不算在 consistent gets里了。所以虽然

第2个SQL和select count(0)的consistent gets相同,但它的效率一定比select count(0)低,我

们看执行计划里的COST便可以得知,第2个SQL的COST为7,select count(0)的COST为6,第1个SQL的

COST也为6.(COST相同并不代表执行效率完全相同)

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-08-25 05:39:34

在Oracle中使用consistent gets的特例的相关文章

oracle中OBJ4 ORA-8102故障恢复案例

  下面我们一起来看看关于oracle中OBJ4 ORA-8102故障恢复案例,希望本文章可以帮助到各位朋友. 在测试环境中对于OBJ$中i_obj4中出现ORA-8102进行了重新并恢复测试,认为自己已经比较清楚的掌握了I_OBJ4的ORA-8102问题处理,可是实际的一个案例,还是比较比实验中复杂,这里贴出来主要操作供大家参考,再次证明数据库恢复的场景不可大意,客户的故障只有你想不到的,没有遇不到的 通过bbed修改obj$中dataobj$重现I_OBJ4索引报ORA-08102错误 使用

Oracle中基于hint的3种执行计划控制方法详细介绍_oracle

hint(提示)无疑是最基本的控制执行计划的方式了:通过在SQL语句中直接嵌入优化器指令,进而使优化器在语句执行时强制的选择hint指定的执行路径,这种使用方式最大的好处便是方便和快捷,定制度也很高,通常在对某些SQL语句执行计划进行微调的时候我会首选这种方式,不过尽管如此,hint在使用中仍然有很多不可忽视的问题: 使用hint过程中有一些值得注意的细则,首先便是要准确的识别对应的查询块,如果需要使用注释也可以hint中声明:对于使用别名的对象一律使用别名来引用,并且诸如"用户名.对象&quo

Oracle中的优化器--CBO和RBO

Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)          RBO: Rule-Based Optimization 基于规则的优化器          CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿

Oracle中的游标、硬解析、软解析、软软解析、解析失败

Oracle中的游标.硬解析.软解析.软软解析.解析失败 一. 游标的分类及共享游标 游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor).共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA和V$SQL来查看当前缓存在库缓存(Library Cache)中的父游标和子游标,其中V$SQLAREA用于查看父游标,V$SQL用

MySQL和Oracle中的半连接测试总结(一)

SQL中的半连接在MySQL和Oracle还是存在一些差距,从测试的情况来看,Oracle的处理要更加全面. 首先我们来看看在MySQL中怎么测试,对于MySQL方面的测试也参考了不少海翔兄的博客文章,自己也完整的按照他的测试思路练习了一遍. 首先创建下面的表: create table users( userid int(11) unsigned not null, user_name varchar(64) default null, primary key(userid) )engine=

Oracle中的并行

Oracle中的并行 一Oracle中的并行 首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元.例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户.并行处理的机制实际上就是把一个要扫描的数据集分成

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con

用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案!

问题描述 用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案! 解决方案 http://www.linuxidc.com/Linux/2014-02/96678.htm 照这个链接再搞一下 解决方案二: 我当初就是照他的方案弄得 不知道为什么连接不上去

在Oracle中计算时间差的方法

如何在Oracle中计算时间差呢?计算时间差是Oracle DATA数据类型的一个常见问题.Oracle支持日期计算,你可以创建诸如"日期1-日期2"这样的表达式来计算这两个日期之间的时间差. 一旦你发现了时间差异,你可以使用简单的技巧来以天.小时.分钟或者秒为单位来计算时间差.为了得到数据差,你必须选择合适的时间度量单位,这样就可以进行数据格式隐藏. 使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法. round(to_number(end-date-st