Oracle获取执行计划方法

一. 背景介绍
  当我们质疑一条SQL语句执行缓慢,进而尝试是否有改进可能性的时候。我们往往需要查看这条SQL语句对应的执行计划,那么在oracle中如何获取执行计划是本文要介绍的内容。
  www.2cto.com  
 二. 获取方法
  oracle提供四种获取执行计划的方法:
  1. 执行SQL语句explain plan,然后查询结果输出表(普遍方法)
  2. 查询一张动态性能视图
  3. 查询自动工作量库或者statspack表
  4. 启动提供执行计划的跟踪功能(比如启动sql_trace)
  www.2cto.com  
 三. SQL语句EXPLAIN PLAN(方法一)
  这个命令是以一条SQL语句作为输入,得到这条SQL的执行计划,并且将结果输出到计划表中。语法如下:
 explain plan for select count(*) from user_objects  /*解析获取执行计划*/
 select * from table (dbms_xplan.display) /*查询计划表显示执行计划*/
 
  如果查看的是绑定变量SQL的执行计划,SQL必须是变量的形式,比如:
  explain plan  for select * from emp where empno = :p_value.
  但是,存在一个问题,由于命令explain plan不能使用绑定变量窥测,也就是explain plan显示的执行计划,可能不是真正的执行计划。也就是说,如果使用了绑定变量,那么explain plan生成的执行计划是不可靠的(当然,这是针对绝对可靠而言,其实已经很可靠了)
 
 四. 查询动态性能视图获取执行计划(方法二)
 SQL语句被解析执行之后,会在共享池里面缓存着这条SQL语句的解析结果和执行计划,我们可以通过两个字段从动态性能视图里面查出执行计划。一个是sql_id(父游标,代表一条SQL的解析结果),一个是sql_child_number(SQL语句执行计划序号,一条SQL可能对应多个执行计划),这两个字段在视图v$session和V$sql里面都存在。如果我们想查看的是当前正在执行SQL的执行计划,可以通过如下SQL查出这两个字段:  www.2cto.com  
select a.SQL_ID, a.SQL_CHILD_NUMBER, b.SQL_TEXT 
 from v$session a, v$sql b 
 where a.SQL_ID = b.SQL_ID 
 and a.USERNAME is not null 
 and a.STATUS = 'ACTIVE'  
 
  如果你知道要查看那一条SQL语句的执行计划,可以直接查询V$sql视图,比如:
select a.SQL_ID, a.CHILD_NUMBER 
 from v$sql a 
 where a.SQL_TEXT like '%cm_cost where pk_cost%' 
  查询到这两字段之后,直接通过一个dbms_xplan包的display_cursor函数就能查看这条SQL的执行计划,如下所示:  www.2cto.com  
select * from table(dbms_xplan.display_cursor('7ngvh44anxzx1', 0)) 
  结果可能如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值