`
norswo
  • 浏览: 5155 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

OracleSql执行计划基础

阅读更多

www.chinaitlab.com找来备忘

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个记录。

分享到:
评论

相关推荐

    Oracle执行计划参数解释

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

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    第一篇“执行计划”详细介绍各种执行计划的含义与操作,为后面的深入分析打下基础。 第二篇“SQL优化技术”深入分析Oracle的SQL优化技术,包括逻辑优化技术和物理优化技术。 第三篇“SQL调优技术”深入剖析Oracle...

    ORACLE SQL性能优化系列

    因此,当你执行一个 SQL 语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE 就能很快获得已经被解析的语句以及最好的执行路径。ORACLE 的这个功能大大地提高了 SQL 的执行性能并节省了内存...

    《精通Oracle SQL 第2版》PDF版本下载.txt

    - **SQL优化**: 通过分析执行计划来识别并改进慢查询。 - **系统参数调整**: 调整Oracle数据库的配置参数以提高整体性能。 - **硬件升级**: 在某些情况下,增加内存或更快的磁盘驱动器也可以显著提高性能。 通过...

    OracleSQL基础知识论述.pptx

    Oracle SQL 基础知识论述 Oracle SQL 是一种基于关系型数据库管理系统(RDBMS)的查询语言,由 IBM Corporation, Inc. 开发,用于实现 Dr. E. F. Codd 的关系模型。1979 年,Relational Software, Inc.(现在的 ...

    Oracle sql优化.pdf

    本文将从 Oracle SQL 优化的基础知识开始,介绍 SQL 执行步骤、SQL 优化的基础知识、性能检测工具、性能问题 SQL 分析、执行计划分析、优化器参数调整等方面的知识点。 一、SQL 执行步骤 SQL 执行步骤是 Oracle ...

    使用plsql查看执行计划

    在Oracle数据库中,执行计划是决定SQL语句如何高效运行的关键步骤。在处理复杂的查询时,优化器(Optimizer)会根据一系列策略选择最优的执行路径。本篇文章将深入探讨如何使用PL/SQL来查看和理解Oracle的执行计划,...

    Oracle-SQL.rar_oracle_oracle sql_sql

    10. **数据库连接与管理工具**:如SQL*Plus、SQL Developer等,是与Oracle数据库交互的常用工具,它们能帮助我们执行SQL语句,管理数据库对象,以及监控数据库状态。 通过这份“Oracle SQL.ppt”,初学者可以逐步...

    oracle SQL语法大全

    本资料“Oracle SQL语法大全”将全面涵盖Oracle SQL的基础概念、语法结构以及高级特性。 一、SQL基础 SQL的基本组成部分包括SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)和DDL(数据定义语言)...

    精通OracleSQL第2版.zip

    Oracle SQL是Oracle数据库系统中的结构化查询语言,它是对数据库进行操作的基础工具,包括数据查询、数据插入、更新和删除等基本功能。本书的第二版可能涵盖了新的特性和改进,以适应Oracle数据库不断发展的变化。 ...

    ORACLE执行计划和SQL调优

    Oracle执行计划和SQL调优是数据库管理中至关重要的环节,对于优化数据库性能有着直接的影响。在Oracle数据库系统中,理解执行计划以及如何调整SQL语句是提升系统效率的关键。 首先,Rowid是Oracle中用于定位数据行...

    Oracle 执行计划

    Oracle执行计划是数据库执行SQL语句前确定的操作步骤序列。...它更侧重于提供一个关于如何阅读和理解Oracle SQL执行计划的基础说明。通过实践和学习,用户可以逐渐深化对执行计划的理解,并在此基础上优化SQL语句。

    Oracle SQL程序设计基础教程

    Oracle SQL程序设计基础教程是学习数据库管理与查询的入门指南,尤其针对Oracle数据库系统。SQL(结构化查询语言)是数据库管理员、开发人员和分析师进行数据操作和信息检索的通用工具。本教程深入浅出地介绍了...

    Pro Oracle SQL Development

    1. **基础查询**:Oracle SQL的基础始于数据查询,包括选择特定列、过滤行(WHERE子句)、排序结果(ORDER BY子句)和分组数据(GROUP BY子句)。学习如何有效地使用这些元素可以提高查询效率。 2. **高级查询**:...

    OracleSQL必备参考

    1. **SQL基础**:Oracle SQL遵循SQL标准,包括基本的SELECT语句用于查询数据,INSERT用于插入新记录,UPDATE用于修改现有记录,以及DELETE用于删除记录。理解这些基本操作是学习Oracle SQL的第一步。 2. **子查询**...

    Oracle 执行计划、表分区

    执行计划是Oracle数据库处理SQL查询的一种步骤序列,它详细描述了数据如何从表中提取、如何进行排序或聚合,以及如何返回到应用程序。理解执行计划对于优化SQL语句和提高数据库性能至关重要。 1. **执行计划的理解...

    ORACLE SQL入门与实战经典

    接下来,将详细介绍Oracle SQL的一些基础知识点以及应用这些知识进行实战的策略和技巧。 Oracle SQL基础知识点主要包括以下几个方面: 1. SQL语言概述:结构化查询语言(SQL)是一种用于管理和操作关系数据库的...

Global site tag (gtag.js) - Google Analytics