分析oracle的执行计划(explain plan)并对对sql进行优化实践

基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql进行优化做相应说明。

一、什么是执行计划(explain plan)

执行计划:一条查询语句在oracle中的执行过程或访问路径的描述。

二、如何查看执行计划

1.set autotrace on

2.explain plan for sql语句;

select plan_table_output from table(dbms_xplan.display());

3.通过第3方工具,如plsql developer(f5查看执行计划)、toad等;

三、看懂执行计划

1.执行计划中字段解释

  1. SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;
  2. 已选择13行。
  3. 执行计划
  4. ----------------------------------------------------------
  5. Plan hash value: 992080948
  6. ---------------------------------------------------------------------------------------
  7. | Id  | Operation                    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
  8. ---------------------------------------------------------------------------------------
  9. |   0 | SELECT STATEMENT             |        |    13 |   988 |     6  (17)| 00:00:01 |
  10. |   1 |  MERGE JOIN                  |        |    13 |   988 |     6  (17)| 00:00:01 |
  11. |   2 |   TABLE ACCESS BY INDEX ROWID| EMP    |    14 |   532 |     2   (0)| 00:00:01 |
  12. |   3 |    INDEX FULL SCAN           | PK_EMP |    14 |       |     1   (0)| 00:00:01 |
  13. |*  4 |   SORT JOIN                  |        |    13 |   494 |     4  (25)| 00:00:01 |
  14. |*  5 |    TABLE ACCESS FULL         | EMP    |    13 |   494 |     3   (0)| 00:00:01 |
  15. ---------------------------------------------------------------------------------------
  16. Predicate Information (identified by operation id):
  17. ---------------------------------------------------
  18. 4 - access("A"."EMPNO"="B"."MGR")
  19. filter("A"."EMPNO"="B"."MGR")
  20. 5 - filter("B"."MGR" IS NOT NULL)
  21. 统计信息
  22. ----------------------------------------------------------
  23. 0  recursive calls
  24. 0  db block gets
  25. 11  consistent gets
  26. 0  physical reads
  27. 0  redo size
  28. 2091  bytes sent via SQL*Net to client
  29. 416  bytes received via SQL*Net from client
  30. 2  SQL*Net roundtrips to/from client
  31. 1  sorts (memory)
  32. 0  sorts (disk)
  33. 13  rows processed
  34. SQL>

对上面执行计划列字段的解释:

Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)

如:上面执行计划的执行顺序为:3--》2--》5--》4--》1

Operation: 当前操作的内容。

Name:操作对象

Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。

Bytes:表示执行该步骤后返回的字节数。

Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。

Time:Oracle 估计当前操作的时间。

2.谓词说明:

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("A"."EMPNO"="B"."MGR")

filter("A"."EMPNO"="B"."MGR")

5 - filter("B"."MGR" IS NOT NULL)

Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。

Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

四、 动态分析

如果在执行计划中有如下提示:

Note

------------

-dynamic sampling used for the statement

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析。

这里会出现两种情况:

(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。

(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

五、表访问方式

1.Full Table Scan (FTS) 全表扫描

2.Index Lookup 索引扫描

There are 5 methods of index lookup:

index unique scan --索引唯一扫描

Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.

index range scan --索引局部扫描

Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) .

index full scan --索引全局扫描

Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.

index fast full scan --索引快速全局扫描,不带order by情况下常发生

Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.

index skip scan --索引跳跃扫描,where条件列是非索引的前导列情况下常发生

Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.

3.Rowid 物理ID扫描

This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式

六、表连接方式

请参照另一篇文章:Oracle 表连接方式详解

http://www.fengfly.com/plus/view-210420-1.html

七、运算符

1.sort --排序,很消耗资源

There are a number of different operations that promote sorts:

(1)order by clauses (2)group by (3)sort merge join –-这三个会产生排序运算

2.filter --过滤,如not in、min函数等容易产生

Has a number of different meanings, used to indicate partition elimination, may also indicate an actual filter step where one row source is filtering, another, functions such as min may introduce filter steps into query plans.

3.view --视图,大都由内联视图产生(可能深入到视图基表)

When a view cannot be merged into the main query you will often see a projection view operation. This indicates that the ‘view‘ will be selected from directly as opposed to being broken down into joins on the base tables. A number of constructs make a view non mergeable. Inline views are also non mergeable.

4.partition view --分区视图

Partition views are a legacy technology that were superceded by the partitioning option. This section of the article is provided as reference for such legacy systems.

附:oracle优化器(Optimizer)

Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。 这些因素直接决定SQL的执行效率,所以优化器是SQL 执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。

Oracle 的优化器有两种:

RBO(Rule-Based Optimization): 基于规则的优化器

CBO(Cost-Based Optimization): 基于代价的优化器

从Oracle 10g开始,RBO 已经被弃用,但是我们依然可以通过Hint 方式来使用它。

在Oracle 10g中,CBO 可选的运行模式有2种:

(1) FIRST_ROWS(n)

Oracle 在执行SQL时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。

(2) ALL_ROWS -- 10g中的默认值

Oracle 会用最快的速度将SQL执行完毕,将结果集全部返回,它和FIRST_ROWS(n)的区别在于,ALL_ROWS强调以最快的速度将SQL执行完毕,并将所有的结果集反馈回来,而FIRST_ROWS(n)则侧重于返回前n条记录的执行时间。

修改CBO 模式的三种方法:

(1) SQL 语句:

Sessions级别:

SQL> alter session set optimizer_mode=all_rows;

(2) 修改pfile 参数:

OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS

(3) 语句级别用Hint(/* + ... */)来设定

Select /*+ first_rows(10) */ name from table;

Select /*+ all_rows */ name from table;

时间: 2024-10-09 22:39:36

分析oracle的执行计划(explain plan)并对对sql进行优化实践的相关文章

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

Oracle查看SQL执行计划1--explain plan

语法:explain plan for + 目标SQLselect * from table(dbms_xplan.display); eg:SQL> explain plan for select empno,ename,dname from scott.emp,scott.dept where emp.deptno=dept.deptno;Explained. SQL> set linesize 800SQL> select * from table(dbms_xplan.displ

使用hint优化Oracle的执行计划

背景: 某表忽然出现查询非常缓慢的情况,cost 100+ 秒以上:严重影响生产. 原SQL: explain plan for select * from ( select ID id,RET_NO retNo, FROM_SYS fromSy, TO_SYS toSys, COMMAND_CODE commandCode, COMMAND, STATUS, EXT_CODE, ORIGN_CODE orignCode,error_message errorMessage, RE_F, RET

ORACLE的执行计划

转自:http://www.cnblogs.com/lovingprince/archive/2007/12/07/2166400.html 背景知识:        为了更好的进行下面的内容我们必须了解一些概念性的术语:共享sql语句 为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer poo

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的,因此SQL的性能优化非常重要.要分析与优化SQL的性能,一般是通过查看该SQL的执行计划,然后通过执行计划有针对性地对SQL进行相应的优化. 什么是执行计划(Explain Plan) 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述. SQL是一门傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划.Oracle必须要做出选择,一次只能有一种访问路径,也就是一次只能有一个执行计划.

Oracle 11g 执行计划管理2

1.创建测试数据 SQL> conn NC50/NC50 Connected. SQL> create table tab1(id number,object_name varchar2(100)); SQL> insert into tab1 select rownum,object_name from dba_objects; SQL> commit; SQL> set line 180 SQL> select * from tab1 where id=200; S

Oracle 11g 执行计划管理1

1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而导致的性能下降. 11g开始,oracle引入了SQL执行计划管理,从而可以让系统自动的来控制SQL语句执行计划的稳定性,进而防止由于执行计划发生变化而导致的性能下降 1.2 11g执行计划管理 优化器会为所有执行次数超过一次的SQL语句维护该SQL语句的每个执行计划的历史列表(plan histo

Oracle 11g 执行计划管理概述

以下内容来源于:http://www.51cto.com/art/200806/76223.htm 35.2  执行计划管理 35.2.1  概述 同一SQL语句的执行计划可能因为优化器的版本.优化统计.优化参数.系统设置的不同而不同.而SQL语句的执行计划自动改变,通常情况下会带来性能提升,但是在某些情况下可能导致系统性能的下降.在11g之前,DBA使用存储大纲(Stored Outline)和SQL 概要(Profile)来固定某些SQL语句的执行计划,防止因为系统自动更改执行计划而导致的性

Pig源码分析: 简析执行计划的生成

摘要 本文通过跟代码的方式,分析从输入一批Pig-latin到输出物理执行计划(与launcher引擎有关,一般是MR执行计划,也可以是Spark RDD的执行算子)的整体流程. 不会具体涉及AST如何解析.如何使用了Anltr.逻辑执行计划如何映射.逻辑执行计划如何优化.MR执行计划如何切分为MR Job,而是从输入一批Pig DSL到待执行的真正执行计划的关键变化步骤(方法和类). 执行计划完整解析 入口处书Main类的main函数 /** * The Main-Class for the