`
soboer
  • 浏览: 1309294 次
文章分类
社区版块
存档分类
最新评论

Oracle优化器Optimizer详解

 
阅读更多

Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。

相信你一定会用Pl/sqlDeveloper、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、Firstrows、Allrows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计划就变了?

1、优化器的优化方式

Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-BasedOptimization,简称为RBO)和基于代价的优化方式(Cost-BasedOptimization,简称为CBO)。

A、RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

B、CBO方式:依词义可知,它是看语句的代价(Cost)了,这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在Oracle8及以后的版本,Oracle列推荐用CBO的方式。


我们要明了,不一定走索引就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时对这个表做全表扫描(fulltablescan)是最好的。

新版本的oracle逐渐抛弃对Rule方式的支持,即使是Rule方式,最后sql执行效率的衡量标准都是,sql执行消耗了多少资源?对代价(COST)的优化方式,需要表,索引的统计信息,需要每天多表和索引进行定时的分析,但是统计信息也是历史的,有时候也不一定是最优的,统计信息等于就是一个人的经验,根据以前的经验来判断sql该怎么执行(得到优化的sql执行路径),所以具体优化执行的时候,先手工分析sql,看是用RBO方式消耗大,还是CBO消耗大;DBA的工作就是要根据当前oracle的运行日志,进行各种调整,使当前的oracle运行效率尽量达到最优.可以在运行期间,采用hint灵活地采用优化方式.

2、优化器的优化模式(OptermizerMode)

优化模式包括Rule,Choose,Firstrows,Allrows这四种方式,也就是我们以上所提及的。如下我解释一下:

Rule:不用多说,即走基于规则的方式。(RBO优化方式)

Choolse:这是我们应观注的,默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(fulltablescan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

FirstRows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。(CBO优化方式,提供一个最快的反应时间,根据系统的需求,使用情况)

AllRows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。(CBO优化方式,提供最大的吞吐量,就是使执行总量达到最大) [Page]

FirstRows和AllRows是有冲突的.如果想最快第返回给用户,就不可能传递更多的结果,这就是FirstRows返回最先检索到的行(或记录);而AllRows是为了尽量将所有的结果返回给用户,由于量大,用户就不会很快得到返回结果.就象空车能跑得很快,重装车只能慢慢地跑;

3、如何设定选用哪种优化模式

a、Instance级别

我们可以通过在init<SID>.ora文件中设定OPTIMIZER_MODE=RULE、OPTIMIZER_MODE=CHOOSE、OPTIMIZER_MODE=FIRST_ROWS、OPTIMIZER_MODE=ALL_ROWS去选用3所提的四种方式,如果你没设定OPTIMIZER_MODE参数则默认用的是Choose这种方式。
init.ora和init<SID>.ora都在$ORACLE_HOME/dbs目录下,可以用find$ORACLE_HOME-nameinit*.ora查看该目录下的init文件.
init.ora是对全体实例有效的;init<SID>.ora只对指定的实例有效.

B、Sessions级别

通过SQL>ALTERSESSIONSETOPTIMIZER_MODE=<Mode>;来设定。将覆盖init.ora,init<sid>.ora设定的优化模式,也可以在sql语句中采用hint强制选定优化模式.如下:

C、语句级别

这些需要用到Hint,比如:
SQL>SELECT/*+RULE*/a.userid,
2b.name,
3b.depart_name
4FROMtf_f_yhdaa,
5tf_f_departb
6WHEREa.userid=b.userid;
在这儿采用hint,强制采用基于规则(rule)的优化模式;
hint语法,/*+开头,*/结尾,中间填写强制采用的优化模式.

4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?

A、不走索引大体有以下几个原因
♀你在Instance级别所用的是all_rows的方式
♀你的表的统计信息(最可能的原因)
♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
B、解决方法
♀可以修改init<SID>.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.
♀删除统计信息
SQL>analyzetabletable_namedeletestatistics;
♀表小不走索引是对的,不用调的。

5、其它相关

A、如何看一个表或索引是否是统计信息

SQL>SELECT*FROMuser_tables2WHEREtable_name=<table_name>
3ANDnum_rowsisnotnull;

SQL>SELECT*FROMuser_indexes
2WHEREtable_name=<table_name>
3ANDnum_rowsisnotnull;

b、如果我们先用CBO的方式,我们应及时去更新表和索引的统计信息,以免生形不切合实的执行计划。
SQL>ANALYZETABLEtable_nameCOMPUTESTATISTICS;
SQL>ANALYZEINDEXindex_nameESTIMATESTATISTICS;

分享到:
评论

相关推荐

    oracle语句优化53个规则详解

    设置缺省的优化器,可以通过对init.ora 文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST, CHOOSE,ALL_ROWS,FIRST_ROWS. 你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO...

    oracle 数据库优化技术资料

    ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你...

    oracle优化详解

    Oracle语句优化30个规则详解: ... 在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.....

    Oracle语句优化30个规则详解

    1. 选用适合的Oracle优化器  Oracle的优化器共有3种:  a. RULE (基于规则)  b. COST (基于成本)  c. CHOOSE (选择性)  设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,...

    Oracle优化53解

    在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 2. 访问Table的方式ORACLE 采用两种...

    专家精讲:Oracle数据库管理与维护 完整版 (第三部)

    详解Oracle数据库的安装、建置,以及安全认证方式;深入剖析Oracle的网络联机架构与设定,包含各类“网络服务组态文件”;详细介绍Oracle数据库的备份与恢复,并列举多项功能强大的复原管理工具;针对数据库、实体...

    专家精讲:Oracle数据库管理与维护 完整版(第2部分)

    详解Oracle数据库的安装、建置,以及安全认证方式;深入剖析Oracle的网络联机架构与设定,包含各类“网络服务组态文件”;详细介绍Oracle数据库的备份与恢复,并列举多项功能强大的复原管理工具;针对数据库、实体...

    Oracle 11g收集多列统计信息详解

    通常,当我们将SQL语句提交给Oracle数据库时,Oracle会选择一种最优方式来执行,这是通过查询优化器Query Optimizer来实现的。CBO(Cost-Based Optimizer)是Oracle默认使用的查询优化器模式。在CBO中,SQL执行计划...

    专家精讲:Oracle数据库管理与维护 完整版(第1部分)

    详解Oracle数据库的安装、建置,以及安全认证方式;深入剖析Oracle的网络联机架构与设定,包含各类“网络服务组态文件”;详细介绍Oracle数据库的备份与恢复,并列举多项功能强大的复原管理工具;针对数据库、实体...

    php网络开发完全手册

    13.3.2 ORACLE 207 13.3.3 SYBASE 207 13.3.4 DB2 207 13.3.5 SQL Server 207 13.4 SQL语言简介 207 13.5 常见的数据库设计问题 208 13.6 关系型数据库的设计原则 209 13.6.1 第一范式(1NF) 209 13.6.2 第二范式...

Global site tag (gtag.js) - Google Analytics