`
qqdwll
  • 浏览: 136709 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle 执行计划

阅读更多
这篇文章, 是根据JavaEye上两篇文章合起来的. 原文分别是:
http://lovesunshine.iteye.com/blog/750170
http://norswo.iteye.com/blog/55546

SQL语句的执行步骤
一条SQL语句的处理过程要经过以下几个步骤。
1 语法分析 分析语句的语法是否符合规范。
2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。
4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。
5 选择优化器 不同的优化器一般产生不同的“执行计划”
6 选择连接方式 Oracle有三种连接方式,对多表连接Oracle可选择适当的连接方式。
7 选择连接顺序 对多表连接Oracle选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9 运行“执行计划 ”


根据这个执行计划可以调整sql,分析消耗的资源、时间,找到更优化的sql

如:

(1)在数据表字段做运算,不能有效利用索引
(2)用<>,!=,is not null,is null,不能有效使用索引
(这里一样)
(3)默认的CBO情况下,!= 和 or的用法是一样的 (下面会介绍下优化器的选择)
(这里一样)

1、优化器的优化方式
  
  Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)。
  
  A、RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
  
  B、CBO方式:依词义可知,它是看语句的代价(Cost)了,这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小 、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在Oracle8及以后的版本,Oracle列推荐用CBO的方式。
  
  我们要明了,不一定走索引就是优的 ,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时对这个表做全表扫描(full table scan)是最好的。
  
2、优化器的优化模式(Optermizer Mode)
  
  优化模式包括Rule,Choose,First rows,All rows这四种方式,也就是我们以上所提及的。如下我解释一下:
  
  Rule:不用多说,即走基于规则的方式。
  
  Choose:这是我们应观注的,默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
  
  First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
  
  All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。
  
3、如何设定选用哪种优化模式
  
  A、Instance级别
  
  我们可以通过在init<SID>.ora文件中设定OPTIMIZER_MODE=RULE、 OPTIMIZER_MODE=CHOOSE、OPTIMIZER_MODE=FIRST_ROWS、OPTIMIZER_MODE=ALL_ROWS去选用2所提的四种方式,如果你没设定OPTIMIZER_MODE参数则默认用的是Choose这种方式。
  
  B、Sessions级别
  
  通过SQL> ALTER SESSION SET OPTIMIZER_MODE=<Mode>;来设定。
  
  C、语句级别
  
  这些需要用到Hint,比如:
  
  SQL> SELECT /*+ RULE */ a.userid,
  2 b.name,
  3 b.depart_name
  4 FROM tf_f_yhda a,
  5 tf_f_depart b
  6 WHERE a.userid=b.userid;
  
  4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ?
  
  A、不走索引大体有以下几个原因
  ♀你在Instance级别所用的是all_rows的方式
  ♀你的表的统计信息(最可能的原因)
  ♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
  
  B、解决方法
  ♀可以修改init<SID>.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用3中所提的Hint.
  ♀删除统计信息
  SQL>analyze table table_name delete statistics;
  ♀表小不走索引是对的,不用调的。
  
  5、其它相关
  
  A、如何看一个表或索引是否有统计信息
  
  SQL>SELECT * FROM user_tables
  2 WHERE table_name=<table_name>
  3 AND num_rows is not null;
  SQL>SELECT * FROM user_indexes
  2 WHERE table_name=<table_name>
  3 AND num_rows is not null;
  
  b、如果我们先用CBO的方式,我们应及时去更新表和索引的统计信息,以免生形不切合实的执行计划。
  
  SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
  SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;
  
  具体的ANALYZE语句请参照Oracle8i/9i 的refrence文档。
附:
  
  1。启动trace的选项:
  set autotrace trace explain
  如果出现下面的错误:
  
  SQL> set autotrace trace explain
  SP2-0613: Unable to verify PLAN_TABLE format or existence
  SP2-0611: Error enabling EXPLAIN report
  
  那么要先运行下面的语句:
   @?/rdbms/admin/utlxplan.sql;
  
  2。分析下面的执行计划:
  
  SQL> select ename,dname  from emp, dept  where emp.deptno=dept.deptno   and dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');
  
  Execution Plan
  ----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE
  1  0  NESTED LOOPS
  2  1   TABLE ACCESS (FULL) OF 'EMP'
  3  1   TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
  4  3    INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
  
  关于前面的两个数字,第一个是状态ID,第二个是父ID。
  
  就是如下所示:0-->1-->2
             |
             |-->3-->4
  在上图里,0的执行依靠1,1的执行又依赖2和3,2是没有子ID的,所以2最先执行,然后是4,在然后是3;然后2和3的结果传回1。
  
  在这个里面0行有个字“Optimizer=CHOOSE”,这个就是上文说的那个oracle的优化器了。
  
  还有,看这个“ INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)”,就知道这个语句运行的时候是走INDEX的。
  
  可以猜测这个SQL是使用的RBO,而不是CBO.
  
  如果让它变成CBO的话,可以这样:
  analyze table emp compute statistics;
  analyze table dept compute statistics;
  
  然后再执行一次:
  
  SQL> select ename,dname  from emp, dept  where emp.deptno=dept.deptno   and
   dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');
  
  Execution Plan
  ----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=14 Bytes=252)
  1  0  HASH JOIN (Cost=3 Card=14 Bytes=252)
  2  1   TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=33)
  3  1   TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=14 Bytes=98)
  
  这次执行的时候,就不会走INDEX,而是全表扫描了,因为这个表一共就只有14个记录。
  • 大小: 27.8 KB
分享到:
评论

相关推荐

    oracle 执行计划 详解

    "Oracle 执行计划详解" Oracle 执行计划是数据库性能优化的关键。为了更好地理解和优化 Oracle 数据库的执行计划,我们需要了解执行计划的生成过程、优化方法和执行计划的解读方法。 执行计划生成过程 执行计划的...

    Oracle执行计划参数解释

    Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。

    oracle执行计划解读

    Oracle 执行计划解读 Oracle 执行计划是一种查询执行路径的表示形式,它展示了 Oracle 数据库在执行查询时访问数据的路径。下面是 Oracle 执行计划的详细解读,包括执行计划的定义、访问数据的方式、执行计划层次...

    Oracle执行计划分析

    ### Oracle执行计划分析 #### 一、概述 在Oracle数据库管理中,优化SQL查询性能是一项至关重要的任务。其中,理解并分析SQL执行计划是提升查询效率的关键步骤之一。执行计划是指Oracle数据库根据特定的SQL语句所...

    oracle执行计划建立与阅读

    Oracle执行计划是数据库管理系统在处理SQL语句时的预估工作流程,它是Oracle优化器根据当前数据分布、索引情况和系统资源等信息选择的最佳执行策略。了解和分析执行计划对于提升SQL语句的性能至关重要。 一、生成...

    Oracle 执行计划PPT

    Oracle 执行计划是数据库管理系统在处理SQL查询时制定的一系列步骤,用于高效地检索和处理数据。它是Oracle数据库优化器(Optimizer)根据统计信息、成本估算和已存在的索引等信息生成的。优化器有两种主要的工作...

    Oracle执行计划介绍与测试.pdf

    ### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...

    oracle执行计划详解

    Oracle 执行计划详解是数据库管理系统中一个非常重要的概念。本文将详细介绍 Oracle 执行计划的相关概念、访问数据的存取方法、表之间的连接等内容,并对总结和概述,以便于理解和记忆。 一、相关的概念 1. Rowid ...

    oracle执行计划文档

    除了以上概念,Oracle执行计划还包括其他访问方法,如索引扫描(Index Scan)、索引唯一扫描(Index Unique Scan)、索引快速全扫描(Index Fast Full Scan)以及各种类型的连接操作,如嵌套循环(Nested Loop)、...

    ORACLE执行计划和SQL调优.pptx

    ORACLE 执行计划和 SQL 调优 ORACLE 执行计划和 SQL 调优是关系数据库管理系统中非常重要的概念。执行计划是 Oracle 优化器生成的,用于描述如何访问数据库中的数据的计划。execute plan 中包括了访问路径、表扫描...

    Oracle执行计划详解

    Oracle执行计划详解,包括oracle执行顺序和索引详细介绍

    Oracle执行计划与SQL优化实例.pptx

    《Oracle执行计划与SQL优化实例》这一主题深入探讨了数据库管理与优化的关键方面,尤其针对Oracle数据库环境。本文旨在解析并扩展此PPTX文件中提及的重要知识点,涵盖执行计划的概念、获取方法、解读技巧以及SQL优化...

    ORACLE执行计划和SQL调优

    ORACLE执行计划和SQL调优

    oracle执行计划详细解释

    oracle执行计划详细解释

    Oracle执行计划.ppt

    Oracle 执行计划 Oracle 执行计划是 Oracle 数据库中的一种机制,用于确定如何访问存储器,得到需要的结果集。执行计划的主要内容包括访问方式和访问顺序。下面是 Oracle 执行计划的详细知识点: 一、执行计划的...

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

    总之,Oracle执行计划的稳定性与数据库性能紧密相关,理解并掌握优化器的工作原理以及如何控制执行计划的选择,是优化数据库性能的关键。在基于代价的优化器模式下,虽然存在执行计划不稳定的可能,但通过合理管理和...

    Oracle 执行计划稳定性

    总之,Oracle执行计划的稳定性对于数据库的高效运行具有重要意义。通过合理管理统计信息、选择合适的优化器模式、利用SQL提示和监控工具,可以有效控制执行计划的稳定性,从而提升数据库的整体性能。

    Oracle执行计划1.ppt

    "Oracle 执行计划" Oracle 执行计划是 Oracle 数据库中的一种机制,用于优化 SQL 语句的执行过程。它决定了如何访问存储器,得到需要的结果集。执行计划的主要内容包括访问方式和访问顺序。 Oracle 执行计划的生成...

Global site tag (gtag.js) - Google Analytics