Oracle优化器和执行计划

1.
优化器(Optimizer)是sql分析和执行的优化工具,它负责制定sql的执行计划,负责保证sql执行效率最高,比如决定oracle以什么方式访问数据,全表扫描(full
table scan)还是索引范围(index range scan)扫描,还是全索引快速扫描(index fast full scan,
INDEX_FFS),对于表关联查询,是用什么方式关联。有2种优化器,RBO和CBO,从oracle
10g开始,RBO已经被弃用,但是仍可以通过hint的方式使用。

2.
RBO执行机制:在优化器里嵌入若干种规则,执行的sql符合什么规则,则按照规则制定执行计划,这些规则是按照优先级排列。 select /*+ rule */ *
from t where id=1; 使用hint方式强制使用RBO优化器执行。

3.
CBO执行机制:获取所有执行计划相关信息,通过对这些信息的分析,最后得出一个代价最小的执行计划作为最终的执行计划。

4. 即使在表,索引没有被分析的时候,oracle仍会使用CBO(从oracle
10g开始,RBO已经被弃用),
此时oracle会使用动态采样,在分析sql的时候,动态的收集表,索引上的一些数据块,使用这些数据块的信息及字典中关于这些对象的信息来计算出执行计划的代价,进而挑选出最优的执行计划。动态采样只有在sql执行的第一次,即硬分析阶段使用,后续的软分析不再使用动态采样,直接使用第一次sql硬分析出的执行计划。

5. CBO优化器有2种可选的运行模式:

  • FIRST_ROWS(n):
    oracle在执行sql时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,其他的结果不需要同时返回。这种需求在搜索或分页经常看到。

select /*+
first_rows(10) */ b.x, b.y

from (select /*+
first_rows(10) */ a.*, rownum rnum

from (select /*+
first_rows(10) */ * from t order by x) a where rownum<=20)

b where rnum>=10;

  • ALL_ROWS:将sql执行完毕将结果集全部返回。

select /*+ all_rows
*/ *

from (select /*+
all_rows */ a.*, rownum r

from (select /*+
all_rows */ owner, object_name, created from t where owner=‘sys‘ order
by object_name) a where rownum<=20)

where
r>=10;

6. 执行计划中的基数(Cardinality):
执行计划每一步操作中,Card的值表示CBO预期从一个行源row
source返回的记录数,这个行源可能是一个表,一个索引,也可能是一个子查询。

执行计划中card就是Cardinality的缩写,在10g以后,card被rows替换,表示CBO估算当前操作预期获取的记录数。Cardinality的值对应CBO做出正确的执行计划至关重要。

/*+ dynamic_sampling(t 0) cardinality(t 10000)
*/ 在未分析数据的前提下,禁止动态采样并告诉CBO从t表将获取到10000条记录。

7. 执行计划可以使用如下方式得到:

  • explain plan for 如:1.explain plan for
    select * from t; 2. select * from table(dbms_xplan.display);

  • sqlplus命令 set autotrace on; set autotrace
    trace exp, stat;

  • 第三方提供的工具,如Toad,PL/SQL developer

8.
执行计划中的access表示这个谓词条件的值将会影响数据的访问路径(表还是索引),filter表示谓词条件的值并不会影响数据的访问路径,只起到过滤的作用。

9.
如果表没有做分析,那么CBO可以通过动态采样的方式获得分析数据,也可以获得准确的执行计划;如果表分析过,但是分析信息过旧,这时候CBO不会使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

Oracle优化器和执行计划,布布扣,bubuko.com

时间: 2024-10-21 08:59:39

Oracle优化器和执行计划的相关文章

ORACLE优化器RBO与CBO介绍总结

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

Oracle 优化器

http://blog.csdn.net/it_man/article/details/8185370一.优化器基本知识 Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行.分析语句的执行计划的工作是由优化器(Optimizer)来完成的.不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的. 相信你一定会用Pl/sql Developer.Toad等工具去看一个语句的执行计划,不过你可能对Rule.Choos

Hive语法层面优化之五分析执行计划追踪导致数据倾斜的原因

count(distinct key)案例 explain select count(distinct session_id) from trackinfo where ds=' 2013-07-21' ; STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 is a root stage STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: trackinfo T

Oracle优化器三大种类的介绍

Oracle优化器一共有三种即,RULE (基于规则),COST (基于成本)以及CHOOSE (选择性),我们大家都知道设置缺省的相关Oracle优化器,其可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明. 如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,

【Oracle 优化器】自适应执行计划(Adaptive Execution Plans)

概述 自适应连接方法AJM AJM例 AJM的处理流程 自适应并行分配方法APDM APDM例 APDM的处理流程 关于分配方法 总结 参考 概述 我们知道在12c之前的版本,虽然有ACS.CFB等功能通过在SQL文执行时收集信息,来改善SQL文再次执行时的执行计划,但是在SQL文第一次执行时,只能根据统计信息做成的执行计划执行SQL,在执行过程中并不能改变. 如果统计信息不准确,访问的数据行数非常大并且选择的执行计划不是最优时,在SQL文第一次执行时可能会引起在灾难性的性能问题. 自适应执行计

[z]Oracle性能优化-读懂执行计划

http://blog.csdn.net/lifetragedy/article/details/51320192 Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain [sql] view plain copy explain plan set STATEMENT_ID='testplan' for select * from dual; [sql] view plain copy select lpad(' ',5*(level-1))||operation

Oracle性能优化-读懂执行计划

Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * from dual; select lpad(' ',5*(level-1))||operation operation, options, object_name, cost,position from plan_table start with id=0 and STATEMENT_ID='test

Oracle优化器的基础知识(二)

一. 表连接 顾名思义,表连接就是指多个表之间用连接条件连接在一起,使用表连接的目标SQL的目的就是从多个表获取存储在这些表中的不同维度的数据.体现在SQL语句上,含表连接的目标SQL的from部分会出现多个表,而这些SQL的where条件部分则会定义具体的表连接条件. 当优化器解析含表连接的目标SQL时,它除了会根据目标SQL的SQL文本的写法来决定表连接的类型之外,还必须决定如下三件事情才能得到最终的执行计划. 1.表连接顺序 不管目标SQL中有多少个表做表连接,Oracle在实际执行该SQ

【Oracle 优化器】自适应游标共享(Adaptive Cursor Sharing)功能

概述 我们知道,由于绑定变量窥视(Bind Peeking)功能,SQL文在进行硬解析(Hard Parse)时,会代入绑定变量的值来估算选择基数(cardinality )并做成执行计划,而相同的SQL文以后在执行过程中,都会共享初次执行时做成的执行计划. 如果表的数据分布不均或者数据倾斜时,用于估算的变量值和以后执行中的用到的变量值估算选择基数(cardinality )差异很大时,通过绑定变量窥视(Bind Peeking)功能做成的执行计划,针对某些变量值的执行可能都是最优的,甚至可能引