`
小杨学JAVA
  • 浏览: 884876 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

查看Oracle执行计划的几种方法

 
阅读更多

转:http://blog.csdn.net/java3344520/article/details/5506718

 

查看Oracle执行计划的几种方法

一、通过PL/SQL Dev工具

    1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%Cardinality表示执行的行数,等价Rows

    2、先执行 EXPLAIN PLAN FOR   select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法。

注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持。

 

二、通过sqlplus

1.最简单的办法

Sql> set autotrace on

Sql> select * from dual;

  执行完语句后,会显示explain plan 与 统计信息。

  这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。如果不想执行语句而只是想得到执行计划可以采用:

Sql> set autotrace traceonly

这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:

(1)在要分析的用户下:

Sqlplus > @ ?

dbmsadminutlxplan.sql

(2) sys用户登陆

Sqlplus > @ ?sqlplusadminplustrce.sql

Sqlplus > grant plustrace to user_name;

- - user_name是上面所说的分析用户

 

 2.用explain plan命令

(1) sqlplus > explain plan for select * from testdb.myuser

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

  上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化。其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的。此时有许多现成的语句可以找出耗费资源比较多的语句,如:

SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,

buffer_gets/executions AVG  FROM  v$sqlarea

WHERE executions>0 AND buffer_gets > 100000   ORDER BY 5;

ADDRESS      TEXT                     BUFFER_GETS    EXECUTIONS        AVG

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

66D83D64   select t.name,  (sel               421531        60104            7.01336017

66D9E8AC   select t.schema, t.n               1141739        2732            417.913250

66B82BCC   select s.synonym_nam             441261        6                73543.5

  从而对找出的语句进行进一步优化。当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划,这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(ParseExecuteFetch)分别耗费的各个资源情况(CPUDISKelapsed)

 

3、启用SQL_TRACE跟踪所有后台进程活动:

全局参数设置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)

    当前session中设置:

    SQL> alter session set SQL_TRACE=true;

    SQL> select * from dual;

    SQL> alter session set SQL_TRACE=false;

    对其他用户进行跟踪设置:

    SQL> select sid,serial#,username from v$session where username='XXX';

       SID    SERIAL# USERNAME

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

       127      31923 A

       128      54521 B

    开启跟踪:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);

    关闭跟踪:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);

    然后使用oracle自带的tkprof命令行工具格式化跟踪文件。

 

4、使用10046事件进行查询:

    10046事件级别:

    Lv1  - 启用标准的SQL_TRACE功能,等价于SQL_TRACE

    Lv4  - Level 1 + 绑定值(bind values)

    Lv8  - Level 1 + 等待事件跟踪

    Lv12 - Level 1 + Level 4 + Level 8

    全局设定:

    OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"

    当前session设定:

    开启:SQL> alter session set events '10046 trace name context forever, level 8';

    关闭:SQL> alter session set events '10046 trace name context off';

    对其他用户进行设置:

    SQL> select sid,serial#,username from v$session where username='XXX';

       SID    SERIAL# USERNAME

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

       127      31923 A

 

    SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');

 

5使用tkprof格式化跟踪文件: (根据下面SQL语句得到的文件都不存在该目录下,郁闷啊,懵懂啊...)

 

一般,一次跟踪可以分为以下几步:

1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪。

2、经过一段时间后,停止跟踪。此时应该产生了一个跟踪结果文件。

3、找到跟踪文件,并对其进行格式化,然后阅读或分析。

 

--使用一下SQL找到当前session的跟踪文件:

SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
from
select p.spid from v$mystat m,v$session s, v$process p
where m.statistic# = 
1
 and s.sid = m.sid and p.addr = s.paddr) p,
select t.instance from v$thread t,v$parameter v
where v.name = 
'thread' and (v.value = 0
 or t.thread# = to_number(v.value))) i,
select value from v$parameter where name = 
'user_dump_dest'
 ) d;
-- 其它用户的 session

    SELECT d.value|| 
'/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc'trace_file_name
    from
    ( select p.spid from v$session s, v$process p
          where s.sid= 
'27' and s. SERIAL#= '30'
 and p.addr = s.paddr) p,
    ( select t.instance from v$thread t,v$parameter v
          where v.name = 
'thread' and (v.value = 0
 or t.thread# = to_number(v.value))) i,
    ( select value from v$parameter where name = 
'user_dump_dest' ) d;

 

--查找后使用tkprof命令,TRACE文件格式为到D盘的explain_format.txt文件中

SQL> $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc  d:/explain_format.txt

 

文件内容大致如下(看不太懂....懵懂啊.....天啊....神啊.....过几时就懂了/////////////)

TKPROF: Release 9.2.0.1.0 - Production on 星期二 4 20 13:59:20 2010

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc

Sort options: default

********************************************************************************

count    = number of times OCI procedure was executed

cpu      = cpu time in seconds executing

elapsed  = elapsed time in seconds executing

disk     = number of physical reads of buffers from disk

query    = number of buffers gotten for consistent read

current  = number of buffers gotten in current mode (usually for update)

rows     = number of rows processed by the fetch or execute call
********************************************************************************

alter session set events '10046 trace name context forever, level 8'

 

call     count       cpu    elapsed       disk      query    current        rows

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

Parse        0      0.00       0.00          0          0         0           0

Execute      1      0.00       0.00          0          0         0           0

Fetch        0      0.00       0.00          0          0         0           0

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

total        1      0.00       0.00          0          0         0           0

 

Misses in library cache during parse: 0

Misses in library cache during execute: 1

Optimizer goal: CHOOSE

Parsing user id: SYS

分享到:
评论

相关推荐

    使用plsql查看执行计划

    Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在不同的条件下,一个SQL可能存在多条执行计划,但是在某个特定的时间点,特定的环境下...

    Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下

    oracle rman自动备份的计划任务CROND不执行的几种情况及解决

    oracle rman自动备份的计划任务CROND不执行的几种情况及解决

    crond 执行ORACLE rman备份脚本失败的几种情况及解决

    crond 执行ORACLE rman备份脚本失败的几种情况及解决

    oracle explain plan总结

    oracle执行计划,oracle explain plan,在ORACLE数据库中,需要对SQL语句进行优化的话需要知道其执行计划,从而针对性的进行调整.ORACLE的执行计划的获得有几种方法,下面就来总结下

    oracle执行动态sql

    Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20; 但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态...

    查看Oracle的执行计划一句话命令

    您可能感兴趣的文章:ORACLE数据库查看执行计划的方法Oracle中获取执行计划的几种方法分析Oracle中使用DBMS_XPLAN处理执行计划详解Oracle中基于hint的3种执行计划控制方法详细介绍Oracle中直方图对执行计划的影响...

    操作系统重装后oracle数据库的恢复

    oradim是oracle实例管理工具,具体参数说明,可以在命令行中直接输入oradim查看帮助提示。使用它能够创建、修改、删除,启动、停止本机上的oracle实例服务,有兴趣的,可以使用它实现一个单数据库多实例的案例。 c...

    Oracle提高SQL执行效率的3种方法

    Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能。现在我们来简要地看看这些方法中的几种。 1、使用ordered提示 Oracle必须花费大量的...

    Oracle数据库的SQL语句的优化

    相信你一定会用Pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、First rows、All rows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计划就变了?

    Oracle中基于hint的3种执行计划控制方法详细介绍

    hint(提示)无疑是最基本的控制执行计划的方式了;通过在SQL语句中直接嵌入优化器指令,进而使优化器在语句执行时强制的选择hint指定的执行路径,这种使用方式最大的好处便是方便和快捷,定制度也很高,通常在对...

    建立用户组保证Oracle数据库安全性

    保证安全性的几种方法:在安装OracleServer前,创建数据库管理员组(DBA)而且分配root和Oracle软件拥有者的用户ID给这个组。允许一部分Unix用户有限制地访问Oracle服务器系统,增加一个由授权用户组的Oracle组,确保...

    ORACLE重建索引总结

    (2)、下面讨论一下这三种方法的优缺点: 2.1、删除并从头开始建索引:方法是最慢的,最耗时的。一般不建议。 2.2、Alter index index_name rebuild 快速重建索引的一种有效的办法,因为使用现有索引项...

    DBA面试题 oracle

    DBA面试题 oracle 1:列举几种表连接方式 2:不借助第三方工具,怎样查看sql的执行计划....

    Oracle数据库学习指南

    10. Oracle8的不安全因素及几点说明 11. Oracle常见错误代码 12. Oracle常用Script 13. Oracle常用数据字典 14. ORACLE回滚段管理(上) 15. ORACLE回滚段管理(下) 16. Oracle基于Client-Server的性能调整 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 ...

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员)

    (上面说的克隆cloning是一种将applications layer和database layer完全复制的一种方法。)所以,当你拥有这三个数据库的时候,打patch的步骤是先development database再test database最后才在production database...

Global site tag (gtag.js) - Google Analytics