您好,欢迎访问一九零五行业门户网

关于Oracle中执行计划稳定性深入研究

欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入 什么是执行计划 所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去
欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入
  什么是执行计划
    所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究的事情。同样对于查询而言,我们提交的sql仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的sql中是没有给出提示信息的,是由数据库来决定的。
  我们先简单的看一个执行计划的对比:
sql> set autotrace traceonly
执行计划一:
sql> select count(*) from t;
count(*)
----------
24815
execution plan
0 select statement optimizer=choose
10  sort (aggregate)
21 table access (full) of 't'
执行计划二:
sql> select count(*) from t;
count(*)
24815
execution plan
0 select statement optimizer=choose (cost=26 card=1)
10  sort (aggregate)
21 index (full scan) of 't_index' (non-unique) (cost=26 card=28180)
这两个执行计划中,第一个表示求和是通过进行全表扫描来做的,把整个表中数据读入内存来逐条累加;第二个表示根据表中索引,把整个索引读进内存来逐条累加,而不用去读表中的数据。但是这两种方式到底哪种快呢?通常来说可能二比一快,但也不是绝对的。这是一个很简单的例子演示执行计划的差异。对于复杂的sql(表连接、嵌套子查询等),执行计划可能几十种甚至上百种,但是到底那种最好呢?我们事前并不知道,数据库本身也不知道,但是数据库会根据一定的规则或者统计信息(statistics)去选择一个执行计划,通常来说选择的是比较优的,但也有选择失误的时候,这就是这次讨论的价值所在。
oracle优化器模式
oracle优化器有两大类,基于规则的和基于代价的,在sqlplus中我们可以查看init文件中定义的缺省的优化器模式。
sql> show parameters optimizer_mode
name typevalue
optimizer_mode string  choose
sql>
这是oracle8.1.7 企业版,我们可以看出,默认安装后数据库优化器模式为choose,我们还可以设置为 rule、first_rows,all_rows。可以在init文件中对整个instance的所有会话设置,也可以单独对某个会话设置:
sql> alter session set optimizer_mode = rule;
会话已更改。
sql> alter session set optimizer_mode = first_rows;
会话已更改。
sql> alter session set optimizer_mode = all_rows;
会话已更改。
[1] [2]
其它类似信息

推荐信息