2006-12-26

Oracle数据库的执行计划稳定性分析

来源: 本站收集整理 作者:佚名 评论 0 条
 

什么是执行计划

所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的具体方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究的事情。同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息的,是由数据库来决定的。

我们先简单的看一个执行计划的对比:

SQL> set autotrace traceonly

  

  执行计划一:

  

  SQL> select count(*) from t;

  

  COUNT(*)

  ----------

  24815

  

  Execution Plan

  

    0   SELECT STATEMENT Optimizer=CHOOSE

  

  1  0  SORT (AGGREGATE)

  

  2  1   TABLE ACCESS (FULL) OF 'T'

  

  执行计划二:

  

  SQL> select count(*) from t;

  

  COUNT(*)

  

  24815

  

  Execution Plan

  

  0   SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)

  

  1  0  SORT (AGGREGATE)

  

  2  1   INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE) (Cost=26 Card=28180)

  

这两个执行计划中,第一个表示求和是通过进行全表扫描来做的,把整个表中数据读入内存来逐条累加;第二个表示根据表中索引,把整个索引读进内存来逐条累加,而不用去读表中的数据。但是这两种方式到底哪种快呢?通常来说可能二比一快,但也不是绝对的。这是一个很简单的例子演示执行计划的差异。对于复杂的SQL(表连接、嵌套子查询等),执行计划可能几十种甚至上百种,但是到底那种最好呢?我们事前并不知道,数据库本身也不知道,但是数据库会根据一定的规则或者统计信息(statistics)去选择一个执行计划,通常来说选择的是比较优的,但也有选择失误的时候,这就是这次讨论的价值所在。

ORACLE优化器模式

ORACLE优化器有两大类,基于规则的和基于代价的,在SQLPLUS中我们可以查看init文件中定义的缺省的优化器模式。

  

  SQL> show parameters optimizer_mode

  

  NAME                 TYPE  VALUE

  

    

  optimizer_mode           string  CHOOSE

  

  SQL>

  

这是ORACLE8.1.7 企业版,我们可以看出,默认安装后数据库优化器模式为CHOOSE,我们还可以设置为 RULE、FIRST_ROWS,ALL_ROWS。可以在init文件中对整个instance的所有会话设置,也可以单独对某个会话设置:


(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:Oracle非法数据库对象引起错误及解决  
下一篇:关于提高Oracle数据库性能的四个误区
    评论加载中…
  

  SQL> ALTER SESSION SET optimizer_mode = RULE;

  

  会话已更改。

  

  SQL> ALTER SESSION SET optimizer_mode = FIRST_ROWS;

  

  会话已更改。

  

  SQL> ALTER SESSION SET optimizer_mode = ALL_ROWS;

  

  会话已更改。
共3页: 上一页 1 [2] [3] 下一页
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号