一、执行计划

执行计划是目标SQL在oracle数据库中具体的执行步骤,oracle用来执行目标SQL语句的具体执行步骤的组合被称为执行计划。

二、如何查看oracle数据库的执行计划

oracle数据库中常用的取得目标SQL语句执行计划的方法有以下几种:

(1)explain plan命令

(2)dbms_xplan包

(3)sqlplus中的autotrace开关

(4)10046事件

1、explain plan命令

explain plan命令具体语法:

(1)explain plan for+目标SQL

(2)select * from table(dbms_xplan.display);

例:

SQL> explain plan for select empno,ename,dname from scott.emp,scott.dept where emp.deptno=dept.deptno;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

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

Plan hash value: 844388907

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

| Id   | Operation  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |        |    14 |   364 |     6 (17)| 00:00:01 |

|   1 |  MERGE JOIN  |        |    14 |   364 |     6 (17)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID | DEPT   |     4 |    52 |     2  (0)| 00:00:01 |

|   3 |    INDEX FULL SCAN | PK_DEPT |     4 |       |     1  (0)| 00:00:01 |

|*  4 |   SORT JOIN  |        |    14 |   182 |     4 (25)| 00:00:01 |

|   5 |    TABLE ACCESS FULL  | EMP    |    14 |    182 |     3  (0)| 00:00:01 |

PLAN_TABLE_OUTPUT

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

Predicate Information (identified by operation id):

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

4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

filter("EMP"."DEPTNO"="DEPT"."DEPTNO")

18 rows selected.

oracle 10g及其以上版本中,如果我们对目标SQL执行explain plan命令,则oracle将解析目标SQL的执行计划写入plan_table$表中,在执行select * from table(dbms_xplan.display);只是将plan_table$表中的执行计划格式化显示出来而已。plan_table$是一个on commit preserver rows的global temporary table,所以这里的oracle的每个session只能看到自己的执行计划并且互不干扰。

SQL> select operation,options,object_name,id,cardinality,cost from sys.plan_table$;

OPERATION      OPTIONS OBJECT_NAME ID   CARDINALITY       COST

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

SELECT STATEMENT    0   14  6

MERGE JOIN    1   14  6

TABLE ACCESS      BY INDEX ROWID    DEPT   2  4 2

INDEX      FULL SCAN    PK_DEPT   3  4  1

SORT      JOIN 4   14   4

TABLE ACCESS      FULL   EMP   5  14  3

6 rows selected.

2、dbms_xplan包

dbms_xplan包根据不同的应用场景主要有以下4种方法:

(1)select * from table(dbms_xplan.display);               --结合explain plan命令使用,不再介绍。

(2)select * from table(dbms_xplan.display_cursor(null,null,'advanced/all'));   --可以查看刚刚执行过得sql。

(3)select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced/all')); --可以查看还在缓存中的所有sql的执行计划。要结合v$sql或v$sqlarea视图进行目标sql信息定位使用。

(4)select * from table(dbms_xplan.display_cursor('sql_id'));  --可以查看不再缓存中的sql执行计划,不包括谓语信息。即查看历史执行计划。

3、sqlplus的autotrace开关

autotrace开关可以在sqlplus下得到目标sql的执行计划,也可以同时得到目标sql的统计信息。autotrace开关的具体语法如下:

set autotrace {off|on|traceonly} [explain] [statistics]

具体使用方法如下:

(1)set autotrace on:显示目标sql的执行结果,执行计划和统计信息。

(2)set autotrace off:只显示目标sql的执行结果,为默认值。

(3)set autotrace traceonly:显示执行结果数量,执行计划和统计信息。

(4)set autotrace traceonly explain:只显示目标sql的执行计划。

(5)set autotrace tranceonly statistics:只显示目标sql的执行结果数量和统计信息。

4、10046事件

这里不做介绍,详见10046事件文档。

三、如何得到真实的执行计划

在上一节一共介绍了4中取得执行计划的方法,这4种方法中除了10046事件外,其他方法取得的执行计划都有可能是不准确的。在oracle数据库中,判断执行计划是否是真实的,就看目标SQL是否被真正执行过,真正执行过得目标sql所对应的执行计划就是准确的,反之就不然。

(1)explain plan命令取得的执行计划可能是不真实的,因为explain plan命令并没有真实的执行过目标SQL.

(2)dbms_xplan包,对于以下4种方法,第一种方法因为与explain plan联合使用,目标sql并没有真正的执行过,所以取得的执行计划是不准确的。其他3种方法目标sql都已经真正的执行过了,所以取得的执行计划是准确的。

1)select * from table(dbms_xplan.display);

2)select * from table(dbms_xplan.display_cursor(null,null,'advanced/all'));

3)select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced/all'));

4)select * from table(dbms_xplan.display_cursor('sql_id'));

(3)sqlplus的autotrace开关,对于autotrace开关而言,采用如下3种方式取得目标sql的执行计划:

1)set autotrace on

2)set autotrace traceonly

3)set autotrace traceonly explain

上述3种方法中,前2种方法已经真实的执行过了目标sql,所以取得的执行计划是准确的,对于set autotrace traceonly explain而言,当目标sql为select语句时,目标sql没有真正的执行,所以所得到的执行计划可能是不准确的,当目标sql为dml语句时,dml语句真实的执行过了,所以取得的执行计划是准确的。

这里需要特殊说明的是:虽然使用部分set autotrace命令后目标sql实际上已经执行过了,但所有使用了set autotrace命令(包括set autotrace on、set autotrace traceonly、set autotrace traceonly explain)所得到的执行计划有可能都是不准确的,因为使用set autotrace所取得的执行计划都取自于explain plan命令。

(4)结论

在进行sql优化过程中,建议使用

select * from table(dbms_xplan.display_cursor(null,null,'advanced/all'));

select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced/all'));

这2种方法来查看待优化sql的执行计划。

Oracle性能优化之Oracle里的执行计划的更多相关文章

  1. Oracle性能优化之 Oracle里的优化器

    优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL的最佳执行计划. ...

  2. Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  3. Oracle性能优化之oracle里表、索引、列的统计信息

    一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...

  4. Oracle性能诊断艺术-读书笔记(执行计划中显示 Starts, E-Rows, REM A-Rows and A-Time)等)

    必须以 ' runstats_last '的方式查看执行计划哦! 操作一 hint  /*+ gather_plan_statistics */  : /* 添加 hint   /*+ gather_ ...

  5. Oracle性能优化之Oracle里的统计信息

    一.什么是统计信息 oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息. oracle数据库里的统计信息主要分为以下6种情况: ...

  6. 基于Oracle的SQL优化(崔华著)-整理笔记-第2章“Oracle里的执行计划”

    详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,加何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的 ...

  7. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

  8. 我眼中的 Oracle 性能优化

    恒生技术之眼 作者 林景忠 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角度 ...

  9. oracle性能优化之awr分析

    oracle性能优化之awr分析 作者:bingjava 最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录. 导致系 ...

随机推荐

  1. 用C语言显示汉字的演示程序

    汉字是方块字,宽高相等的汉字库在嵌入式领域有着广泛的应用,且其解析也相对来说是比较简单的.汉字在汉字库中的索引一般会遵循GB2312/GBK编码规则,GB2312/GBK规定汉字编码由2个字节组成,其 ...

  2. RSQLite 操作sqlite数据库

    RSQLite 可以在R中方便的创建sqlite数据库,并进行检索, 这个R包依赖于DBI包 github 上的地址:https://github.com/rstats-db/RSQLite gith ...

  3. VirtualBox 配置虚拟网卡(桥接),实现主机-虚拟机网络互通

    记录下VirtualBox 配置虚拟网卡(桥接),实现主机-虚拟机网络互通过程,网上搜出来的比较乱,讲的不明不白,因此根据自己弄过一次,确认可行的方式,做个备份,方便日后查阅. 环境: 在Oracle ...

  4. 【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    1.什么是匿名内部类? 内部类,存在于另一个类内部的类,而匿名内部类,顾名思义,就是没有名字的内部类. 2.为什么需要匿名内部类? 每个inner class都能够各自继承某一实现类(implemen ...

  5. [转]JVM性能调优监控工具

    http://my.oschina.net/feichexia/blog/196575?p=1#comments JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jCo ...

  6. 在loadrunner中使用winsocket协议编写脚步三部曲

    这两天写了一个winsocket的脚本,没有通过录制的方式,是直接手写的.下面贴出来和大家分享: 脚本的写法很简单,大体说来,就像把大象放进冰箱一样,总共分三步: 第一步:把冰箱门打开. //建立到服 ...

  7. IPV6设置

    C:\Windows\System32\drivers\etc 目录下修改hosts文件. 网上有更新的ipv6 hosts文件,复制下来~ 别人不断更新的: https://raw.githubus ...

  8. oracle中REF Cursor用法

    from:http://www.111cn.net/database/Oracle/42873.htm 1,什么是 REF游标 ? 动态关联结果集的临时对象.即在运行的时候动态决定执行查询. 2,RE ...

  9. THINKPHP include 标签动态加载文件

    有时候需要在框架中动态的加载一些文件,文件名不确定,有控制器获取得到,想在模板中使用变量的形式进行加载,本以为这样写可以 结果不行 <include file="User/{$my_t ...

  10. Oracle 用户解锁

    ALTER USER hr ACCOUNT UNLOCK ALTER USER hr IDENTIFIED BY welcome