Oracle执行计划是什么

  关于执行计划的概念,相信大家都有过基础的了解。这里不详细解释概念性东西,只需要知道。执行计划是Oracle根据SQL语句生成的一个执行步骤的表述即可。

  执行计划分三部分:1.执行计划的SQL语句,SQL Id 以及对应的执行计划 hash value 。 2.执行计划主体部分。 3.执行计划补充说明。如下:

-- 这里是SQL语句 select empno,ename from emp 的执行计划-- 第一部分

SQL_ID  78bd3uh4a08av, child number 0
-------------------------------------
select empno,ename from empPlan hash value: 3956160932-- 第二部分 (主体部分)
-- 这里主要关注部分,可以看到执行时的执行步骤,执行顺序,对应的谓词信息、列信息, 消耗成本等
-------------------------------------------
| Id  | Operation         | Name | E-Rows |
-------------------------------------------
|   0 | SELECT STATEMENT  |      |        |
|   1 |  TABLE ACCESS FULL| EMP  |     16 |
--------------------------------------------- 第三部分 (补充说明)
Note
------ Warning: basic plan statistics not available. These are only collected when:* hint 'gather_plan_statistics' is used for the statement or* parameter 'statistics_level' is set to 'ALL', at session or system level

Oracle执行计划怎么获取

  获取SQL执行计划的方法有很多,最简单的是在PL/SQL 中直接按F5,就可以获得SQL的执行计划。结果如下:

  explain plan 命令

  使用explain plan 命令得到的结果跟直接按F5得到的结果一致,其操作过程为(以SQL select * from emp 为例):

-- 1.执行 explain 命令SQL,这里的for后面为需要查看执行计划的SQL语句:
explain plan for select * from emp;-- 2.执行如下语句 select * from table(dbms_xplan.display)-- 得到执行结果如下:
Plan hash value: 3956160932--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    16 |   592 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    16 |   592 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

  上面的SQL执行计划,虽然可以得到执行计划,但是不一定是刚执行过的SQL使用的执行计划。也就是说可能是不准确的。使用下面的方法可以得到准确的执行过的SQL的执行计划:

-- 这里的all和advanced都行,二选一。但是必须是从dos窗口中执行,它会取上一次执行的SQL的执行计划返回。
select * from table(dbms_xplan.display_cursor(null,null,'all/advanced'));-- 通过使用该SQL查询执行过的SQL语句的SQLid
SELECT SQL_ID FROM v$SQL  WHERE SQL_TEXT like'select * from emp'
-- 查询该SQL的执行计划,需要在同一个session中执行。
select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'all/advanced'));

  而且,通过以上两种方式得到的执行计划数据会更全一些,会包含执行计划的头部信息和补充说明信息。例如:

SQL_ID  a2dk8bdn0ujx7, child number 0
-------------------------------------
select * from empPlan hash value: 3956160932--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     3 (100)|          |
|   1 |  TABLE ACCESS FULL| EMP  |    16 |   592 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SEL$1 / EMP@SEL$1Column Projection Information (identified by operation id):
-----------------------------------------------------------1 - "EMP"."EMPNO"[NUMBER,22], "EMP"."ENAME"[VARCHAR2,10], "EMP"."JOB"[VARCHAR2,9], "EMP"."MGR"[NUMBER,22], "EMP"."HIREDATE"[DATE,7], "EMP"."SAL"[NUMBER,22], "EMP"."COMM"[NUMBER,22], "EMP"."DEPTNO"[NUMBER,22]

Oracle执行计划怎么看 

  执行顺序

  通过执行计划,我们可以看出执行计划的执行步骤和执行类型。但是执行计划是怎么个执行顺序呢,先执行的哪一步后执行哪一步呢?有个原则,先右后下。简单的说,从上到下,执行计划如果有缩进,算是子过程。类似于目录结构,有向右缩进,就是当前的子过程。先执行完子过程,然后回到父过程。然后执行下一个。下面用个例子说明下执行过程的流程。

  执行计划如下:

SQL_ID  22svdfk7watap, child number 0
-------------------------------------
select emp.ename,EMP_TEMP.EMPNO from emp,EMP_TEMP where emp.ename in
(select ename from EMP_TEMP where empno > 100)Plan hash value: 1993712166----------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |       |       |    16 (100)|          |
|*  1 |  HASH JOIN            |          |   194 |  4074 |    16   (7)| 00:00:01 |
|   2 |   MERGE JOIN CARTESIAN|          |   182 |  2730 |    13   (8)| 00:00:01 |
|   3 |    SORT UNIQUE        |          |    14 |   154 |     3   (0)| 00:00:01 |
|*  4 |     TABLE ACCESS FULL | EMP_TEMP |    14 |   154 |     3   (0)| 00:00:01 |
|   5 |    BUFFER SORT        |          |    14 |    56 |    10  (10)| 00:00:01 |
|   6 |     TABLE ACCESS FULL | EMP_TEMP |    14 |    56 |     1   (0)| 00:00:01 |
|   7 |   TABLE ACCESS FULL   | EMP      |    16 |    96 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SEL$5DA710D34 - SEL$5DA710D3 / EMP_TEMP@SEL$26 - SEL$5DA710D3 / EMP_TEMP@SEL$17 - SEL$5DA710D3 / EMP@SEL$1Predicate Information (identified by operation id):
---------------------------------------------------1 - access("EMP"."ENAME"="ENAME")4 - filter("EMPNO">100)Column Projection Information (identified by operation id):
-----------------------------------------------------------1 - (#keys=1) "EMP"."ENAME"[VARCHAR2,10], "EMP_TEMP"."EMPNO"[NUMBER,22]2 - "ENAME"[VARCHAR2,10], "EMP_TEMP"."EMPNO"[NUMBER,22]3 - (#keys=1) "ENAME"[VARCHAR2,10]4 - (rowset=256) "ENAME"[VARCHAR2,10]5 - (#keys=0) "EMP_TEMP"."EMPNO"[NUMBER,22]6 - (rowset=256) "EMP_TEMP"."EMPNO"[NUMBER,22]7 - (rowset=256) "EMP"."ENAME"[VARCHAR2,10]

  在这个执行计划中,先找到id为0的行,发现有子项目,然后跳到1→2→3→4然后发现id为4的步骤没有子步骤,那么数据库首先执行4这一行。执行完后,看是否存在当前同一级的执行步骤,发现没有,然后返回到步骤3执行步骤3.然后判断发现步骤3有同一级别的执行步骤,进一步判断步骤3是否具有子步骤。发现具有子步骤6,然后执行步骤6.继续之前的判断,执行步骤5然后没有同级步骤存在,执行步骤2,然后下一级步骤执行步骤7,跳上一级执行步骤1步骤0 。整体的执行顺序就是这个样子的。

  常见执行类型

  

Oracle执行计划稳定

转载于:https://www.cnblogs.com/liyasong/p/11535935.html

Oracle 执行计划相关推荐

  1. Oracle执行计划突变诊断之统计信息收集问题

    Oracle执行计划突变诊断之统计信息收集问题 1.  情形描述 DB version:11.2.0.4 WITH SQL1 AS(SELECT LAC,CI,TO_NUMBER(C.LONGITUD ...

  2. ORACLE执行计划的一些基本概念

    本文介绍了ORACLE执行计划的一些基本概念,供学习应用. 一.相关的概念 Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的.对每个表都有一个rowi ...

  3. 海天 oracle,Oracle执行计划详解

    作者:TTTBLOG --- 简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 ...

  4. oracle执行计划分析(转载)

    2019独角兽企业重金招聘Python工程师标准>>> (转载,原文地址:http://blog.itpub.net/24478467/viewspace-705754/) 简介: ...

  5. Oracle 执行计划 提示 'PLAN_TABLE' is old version 解决方法

    用set autotrace 或者 explain plan for 生成执行计划时,有如下提示: Note -----    - 'PLAN_TABLE' is old version 导致这个错误 ...

  6. [转]Oracle执行计划的相关概念

    [转]Oracle执行计划的相关概念 本文介绍了ORACLE执行计划的一些基本概念,供学习应用. 一.相关的概念 Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统 ...

  7. ORACLE 执行计划分析

    http://www.cnblogs.com/rootq/archive/2008/09/06/1285779.html ORACLE 执行计划分析 一.什么是执行计划 An explain plan ...

  8. 【转】Oracle执行计划解释

    Oracle执行计划解释 一.相关的概念     Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物 ...

  9. oracle通过执行计划cost,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引

    Oracle 执行计划(5)-cost成本之索引范围扫描-B树索引 SQL>  select * from t1 where a<600 ; 已选择599行. 已用时间:  00: 00: ...

最新文章

  1. Python之父考虑重构Python解释器
  2. Html5 Canvas 学习之路(一)
  3. C# 值类型的局限性
  4. 【LeetCode笔记】46. 全排列(Java、DFS回溯、队列)
  5. 终端怎么进入hadoop_Ubuntu中使用终端运行Hadoop程序
  6. Java进阶:SpringMVC中放行静态资源
  7. java实验报告遇到的问题,JAVA实验报告_doc
  8. RPCBind 服务被利用进行 UDP 反射 DDoS 风险预警
  9. c++strcmp函数
  10. java4android网易云_仿照网易云音乐界面 android特效
  11. RK987A键盘蓝牙连接电脑
  12. 【电脑技术】修改无线网卡MAC地址失败的原因
  13. 产品经理入门03:需求评审和技术评审
  14. 网络系列--SDN安全
  15. 小心肝队-冲刺日志(第四天)
  16. Detecting Holes in Point Set Surfaces 笔记
  17. 入职华为外包一个月后,我离职向“北上广深”流浪了...
  18. 腾讯soso退出历史舞台,搜索结果全部由搜狗提供
  19. 写一副对子_续《一副对子的传奇故事》
  20. C/C++宏的基本使用方法附例子讲解

热门文章

  1. http http应用
  2. P1772 [ZJOI2006]物流运输
  3. 如何有效地防止网站和手机APP的数据被采集?
  4. Java反射机制--笔记
  5. Java 8 vs. Scala之Lambda表达式
  6. [Android疑难杂症]动态改变Background后Padding无效的问题
  7. 将unicode编码的txt文件转为utf-8编码
  8. 电子商务的发展和出现
  9. linux远程桌面复制文件,SH,telnet,网络拷贝文件,putty,连接windows远程桌面终端,远程控制linux桌面...
  10. java 本地 交互图_Java与UML交互图