当前位置:  数据库>oracle

Oracle如何查看执行计划

    来源: 互联网  发布时间:2017-06-27

    本文导语: 一、如何查看执行计划 在Oracle数据库里,我们通常可以使用如下方法(包括但不限于)得到目标SQL的执行计划: explain plan 命令 DBMS_XPLAN包 SQLPLUS中的AUTOTRACE开关 10046事件 10053事件 AWR报告或Statspack报告 一些现成的脚本(如     display...

一、如何查看执行计划

在Oracle数据库里,我们通常可以使用如下方法(包括但不限于)得到目标SQL的执行计划:

  • explain plan 命令
  • DBMS_XPLAN包
  • SQLPLUS中的AUTOTRACE开关
  • 10046事件
  • 10053事件
  • AWR报告或Statspack报告
  • 一些现成的脚本(如     display_cursor_9i.sql等)
  • 前四种方法使用得比较普遍

    1.1 explain plan 命令

          习惯使用PL/SQL Developer的人都知道,按下快捷键F5后就可以显示目标SQL的执行计划,实际上,PL/SQL Developer就调用了explain plan命令,快捷键F5只不过是在explain plan命令上的一层封装而已。

          explain plan命令的语法是依次执行如下两条命令:

    • explain plan for +     目标SQL

    • select * from     table(dbms_xplan.display)

          先使用explain plan命令对目标SQL做explain,再使用“select * from table(dbms_xplan.display)”查看上述使用explain plan命令后得到的执行计划。

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

    select * from table(dbms_xplan.display);

          explain plan 命令到底做了什么事情呢?在Oracle 10g 及其以上的版本里,如果我们对目标SQL执行explain plan 命令,则Oracle就将解析目标SQL所产生的执行计划的具体执行步骤写入PLAN_TABLE$,随后执行“select * from table(dbms_xplan.display)”只是从PLAN_TABLE$中将这些具体执行步骤以格式化的方式显示出来。PLAN_TABLES$是一个ON COMMIT PRESERVE ROWS的GLOBALTEMPORARY TABLE,所以这里Oracle可以做到各个的Session只能看到自己执行的SQL所产生的执行计划,并且各个Session往PLAN_TABLE$写入执行计划的过程互不干扰。

    1.2 DBMS_XPLAN包

    使用DBMS_XPLAN包中的方法是在Oracle数据库中得到目标SQL的执行计划的第二种方法。针对不同的应用场景,你可以选择如下四种方法中的一种:

  • select * from     table(dbms_xplan.display);

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

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

  • select * from     table(dbms_xplan.display_awr('sql_id'));

  • 方法1是需要与explain plan命令配合使用,上节已经介绍过。

    方法2用于在SQLPLUS中查看刚刚执行过的SQL的执行计划。这里针对方法DBMS_XPLAN.DISPLAY_CURSOR所传入的第一个和第二个参数的值均为null,第三个参数值是“advanced”,第三个输入参数的值也可以是“all”,只不过用“advanced”后的显示结果会比“all”显示的结果更详细一些。

    set linesize 800 pagesize 900

    col plan_table_output for a200

    select empno,ename,dname from scott.emp,scott.deptwhere emp.deptno=dept.deptno;

    select * fromtable(dbms_xplan.display_cursor(null,null,'advanced'));

    select empno,ename,dname from scott.emp,scott.deptwhere emp.deptno=dept.deptno;

    select * fromtable(dbms_xplan.display_cursor(null,null,'all'));

    “all”得到的结果与“advanced”的显示结果相比,少���“Outline Data”部分的内容。

    方法3用于查看指定SQL的执行计划。这里针对方法DBMS_XPLAN.DISPLAY_CURSOR所传入的第一个参数的值是指定SQL的SQL ID或者SQL HASH VALUE,第二个参数的值是要查看的执行计划所在的Chile Cursor Number,第三个参数已经在介绍方法2时已经提到过,这个参数值一般都用“advanced”。

    selectsql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'selectempno,ename%';

    SQL_TEXT                                                                                                                                       SQL_ID            HASH_VALUE CHILD_NUMBER

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

    selectempno,ename,dname from scott.emp,scott.dept where emp.deptno=dept.deptno     3yfu3wh150aqt    38808281          0

    sql_id为3yfu3wh150aqt,SQL HASH_VALUE为38808281,对应的ChildCursor Number为0。

    本质上SQL ID和SQL HASH_VALUE是一回事,它们是可以互相转换的,这也是方法DBMS_XPLAN.DISPLAY_CURSOR所传入的第一个参数的值可以是SQL ID,也可以是SQLHASH_VALUE的原因。

    selectlower(trim('3yfu3wh150aqt')) sql_id,

    trunc(mod(sum((instr('0123456789abcdfghjkmnpqrstuvwxyz',

    substr(lower(trim('3yfu3wh150aqt')),level,1))-1)*power(32,length(trim('3yfu3wh150aqt'))-level)),

    power(2,32)))hash_value

    fromdual

    connectby level


        
     
     

    您可能感兴趣的文章:

  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • win2000+jbuilder6+oracle817编出的程序,在win2000下执行很好,在win98下却访问不了oracle数据库
  • oracle 可以在crontab 中定时执行吗?
  • oracle sql执行过程(流程图)
  • linux能够通过执行脚本添加oracle数据库的用户吗
  • ORACLE安装时/tmp/orainstRoot.sh 执行发生错误
  • 求救:HPUNIX下的ORACLE7执行select * from tablename提示权限不足!!
  • 为什么 export ORACLE_SID=test写在程序里面就不会执行?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • shell 执行oracle sql脚本的问题
  • oracle单库彻底删除干净的执行步骤
  • 查看Oracle的执行计划一句话命令
  • ORACLE安装时/tmp/orainstRoot.sh 执行发生错误 iis7站长之家
  • oracle中得到一条SQL语句的执行时间的两种方式
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Nagios check_oracle_health 关于执行SQL问题
  • 执行Commit时Oracle做哪些工作
  • RedHat AS 4 安装oracle9i的时候,执行Disk1下的runInstaller后提示正在初始化虚拟机,请等待后就再无反应
  • JBUILDER如何执行ORACLE的储存过程
  • 为Oracle增加计划任务
  • 利用windows任务计划实现oracle的定期备份
  • Oracle数据库设置任务计划备份一周的备份记录
  • Oracle公布SPARC五年计划和Solaris 11上市时间
  • Oracle密谋B计划 JDK 7或成跳票王
  • Oracle中获取执行计划的几种方法分析
  • 解析Oracle 8i/9i的计划稳定性
  • Oracle中使用DBMS_XPLAN处理执行计划详解
  • ORACLE数据库查看执行计划的方法
  • Oracle中基于hint的3种执行计划控制方法详细介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux系统查看Oracle服务是否启动
  • Oracle中查看当前用户的表
  • Linux系统下查看oracle SID的方法
  • linux下如何查看是什么用户安装的oracle
  • Oracle中查看某列数据类型
  • oracle查看会话锁定的所有对象代码分享
  • oracle数据库中查看系统存储过程的方法
  • solaris9下怎么查看oracle服务是否启动,以及怎么启动,在线等待。
  • 查看修改Oracle10G归档日志空间的限制
  • 查看及修改Oracle编码格式方法
  • 查看和修改Oracle服务器端字符集
  • oracle删除主键查看主键约束及创建联合主键
  • oracle查看表空间已分配和未分配空间的语句分享
  • oracle查看被锁的表和被锁的进程以及杀掉这个进程
  • Oracle字符集修改查看方法
  • Oracle数据库里查看表空间使用状况
  • 在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误
  • Oracle查看和修改连接数(进程/会话/并发等等)
  • ORACLE查看并修改最大连接数的具体步骤
  • 查看Oracle中是否有锁表的sql
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3