一、获取SQL语句执行计划的方式
1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划
2. 启用执行计划跟踪功能,即autotrace功能
3. 使用PL/SQL Developer提供的获取执行计划方法 - F5键
4. 查询动态性能视图v$sql_plan,v$sql_plan_statistics,v$sql_workarea 等来获取已缓存到库缓存中的真实执行计划
5. 查询自动工作量资料库(Automatic Workload Repository)或查询Statspack,即从资料库中获取执行计划
6. 使用Toad工具来获取执行计划

二、用explain plan来获取SQL语句执行计划
1. 工作实质
将SQL语句预估的执行计划加载到表plan_table,是对表plan_table 执行了DML操作,故不会执行隐式提交。(可以对select,insert,update,merge,delete,create table, create index,alter index等加载执行计划到plan_table。)

2. 前提条件
 需要先创建plan_table,创建方法(可参考Oracle的AUTOTRACE功能):@J:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlxplan.sql
 对当前的SQL语句有执行权限以及对依赖的对象有相应操作的权限

3. 使用方法:
  explain plan for select * from dept where deptno=20;    --未设置标记位
  explain plan set statement_id='t1' for select * from dept where deptno=20;  --设置标记位为T1

SQL> explain plan set statement_id = 't1' for select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;

SQL> col operation format a18
SQL> col options format a15
SQL> col "OBJECT NAME" format a12
SQL> col order format a6
SQL> col opt format a6
SQL>
SQL> SELECT LPAD(' ', 2 * (LEVEL - 1)) || operation "OPERATION",
  2      options "OPTIONS",
  3      DECODE(TO_CHAR(id),
  4          '0',
  5          'COST = ' || NVL(TO_CHAR(position), 'n/a'),
  6          object_name) "OBJECT NAME",
  7      id || '-' || NVL(parent_id, 0) || '-' || NVL(position, 0) "ORDER",
  8      SUBSTR(optimizer, 1, 6) "OPT"
  9  FROM plan_table
 10  START WITH id = 0
 11  AND statement_id = 't1'
 12  CONNECT BY PRIOR id = parent_id
 13  AND statement_id = 't1'  ;

OPERATION          OPTIONS         OBJECT NAME  ORDER  OPT
------------------ --------------- ------------ ------ ------
SELECT STATEMENT                   COST = 4     0-0-4  ALL_RO
  NESTED LOOPS                                  1-0-1
    TABLE ACCESS   FULL            EMP          2-1-1  ANALYZ
    TABLE ACCESS   BY INDEX ROWID  DEPT         3-1-2  ANALYZ
      INDEX        UNIQUE SCAN     PK_DEPT      4-3-1  ANALYZ

查询结果中的order列与opt列
order
     order列:ID-父ID-执行计划中这一步骤的位置
     ID列标识了这个步骤,但并没有说明执行的顺序
     父ID表明了这个步骤中的父步骤
     位置信息说明了父ID相同的子操作的执行顺序    
opt
     说明当前优化器使用的模式

SQL执行计划分析:
     1.从步骤2开始执行,步骤2对EMP表做全表扫描,把得到的结果返回步骤1;
     2.步骤4对DEPT表做唯一索引扫描,扫描的结果返回步骤3,步骤3根据INDEX ROWID找到对应的数据,并返回步骤1;
     3.此时,步骤1对前两步中返回的数据做JOIN,获得的最终结果集返回给步骤0,SQL完成查询;

EXPLAIN PLAN获取SQL语句执行计划的更多相关文章

  1. 使用V$SQL_PLAN视图获取曾经执行过的SQL语句执行计划

    通常我们查看SQL语句的执行计划都是通过EXPLAIN PLAN或者AUTOTRACE来完成.但是这些查看方法有一个限制,它们都是人为触发而产生的,无法获得数据库系统中曾经执行过的SQL语句执行计划. ...

  2. db2数据库创建索引,删除索引,查看表索引,SQL语句执行计划以及优化建议

    1.建立表索引 create index 索引名 on 表名(列名,列名); 2.删除表索引 drop index 索引名 on 表名; 3.查看表索引 select * from sysibm.sy ...

  3. oracle用EXPLAIN PLAN 分析SQL语句

    EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...

  4. [转]使用mysql profiles 来查看sql 语句执行计划

    From : http://blog.csdn.net/radkitty/article/details/4632289 要使用该功能,mysql的版本必须在5.0.37版本以上.否则只能使用expl ...

  5. 通过EXPLAIN分析低效SQL的执行计划

    explain select * from film where rating>9\G; select_type 表示select的类型 SIMPLE 代表简单表,不用表连接或子查询 PRIMR ...

  6. 通过 EXPLAIN 分析低效 SQL 的执行计划

    每个列的简单解释如下:  select_type:表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接 或者子查询).PRIMARY(主查询,即外层的查询).UNION(U ...

  7. 通过10046 event来获取真实的执行计划

    获取SQL执行计划的方式有很多,但是某些时候获取的SQL执行计划并不是准确的,只有在SQL真实执行之后获取到的SQL PLAN才是真实准确的,其他方式(如,explain plan)获取到的执行计划都 ...

  8. DRDS分布式SQL引擎—执行计划介绍

    摘要: 本文着重介绍 DRDS 执行计划中各个操作符的含义,以便用户通过查询计划了解 SQL 执行流程,从而有针对性的调优 SQL. DRDS分布式SQL引擎 — 执行计划介绍 前言 数据库系统中,执 ...

  9. PL/SQL DEVELOPER执行计划的查看

    这里,我学到的一个很重要的东西,就是用PL/SQL DEVELOPER去看一条SELECT语句的执行计划,执行计划里面可以看到这条SELECT语句的开销.I/O操作开销等数值,可以很清晰地看到语句各个 ...

随机推荐

  1. 移植最新u-boot(裁剪和修改默认参数)之韦东山笔记

    1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 make ...

  2. hihocoder 1043 完全背包

    #1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...

  3. JAVA网络编程常见问题

    一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...

  4. Spring(3.2.3) - Beans(10): 生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...

  5. Git CMD - add: Add file contents to the index

    命令格式 git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [- ...

  6. linux下vsftpd的安装与配置说明

    问题: 1.530 Permission denied.答:配置文件中userlist_enable=YES(如果启用即YES,则看userlist_deny=YES/NO,如果为NO,则要把登录的用 ...

  7. OC7_复合类内存管理(setter方法)

    // // Person.h // OC7_复合类内存管理(setter方法) // // Created by zhangxueming on 15/6/18. // Copyright (c) 2 ...

  8. Android知识思维导图

    注:图片来源于网络,谢谢分享. 一.  项目目录结构: 布局控件 ListVIew控件 Widget:(窗口小部件) Activity Manager 二.  应用程序的5个模块构成: Activit ...

  9. EFFECTIVE JAVA 第十一章 系列化

    EFFECTIVE  JAVA  第十一章  系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...

  10. c#跨窗体调用操作

    我知道的常用的有三种,以前记录的笔记: 1.通过构造函数实现 在form1的load事件中new form2时  在构造函数里添加一个参数 此参数就是form1类型的参数,同时记得在form2里重写构 ...