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

前端之家收集整理的这篇文章主要介绍了查看Oracle执行计划的几种方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

一、通过PL/sql Dev工具

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

2、先执行EXPLAIN PLAN FORselect * 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引起的。此时有许多现成的语句可以找出耗费资源比较多的语句,如:

SELECTADDRESS,substr(sql_TEXT,1,20) Text,buffer_gets,executions,

buffer_gets/executions AVGFROMv$sqlarea

WHEREexecutions>0 AND buffer_gets > 100000ORDER BY5;

ADDRESSTEXTBUFFER_GETSEXECUTIONSAVG

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

66D83D64select t.name,(sel421531601047.01336017

66D9E8ACselect t.schema,t.n11417392732417.913250

66B82BCCselect s.synonym_nam441261673543.5

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

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';

SIDSERIAL# USERNAME

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

12731923 A

12854521 B

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

关闭跟踪:sql> exec dbms_system.set_sql_TRACE_in_session(127,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> exec dbms_system.set_ev(127,10046,8,'A');

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

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

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

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

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

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

SELECTd.value||'/'||lower(rtrim(i.instance,chr(0)))||'_ora_'||p.spid||'.trc'trace_file_name
from
(selectp.spidfromv$mystat m,v$session s,v$process p
wherem.statistic# =
1ands.sid = m.sidandp.addr = s.paddr) p,
(selectt.instancefromv$thread t,v$parameter v
wherev.name=
'thread'and(v.value=0ort.thread# = to_number(v.value))) i,
(selectvaluefromv$parameterwherename=
'user_dump_dest') d;
--其它用户session
SELECTd.value||'.trc'trace_file_name
from
(selectp.spidfromv$session s,v$process p
wheres.sid='27'ands. SERIAL#='30'andp.addr = s.paddr) p,
(selectt.instancefromv$thread t,v$parameter v
wherev.name='user_dump_dest') d;

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

sql> $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trcd:/explain_format.txt

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

TKPROF: Release 9.2.0.1.0 - Production on星期二420 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'

callcountcpuelapseddiskquerycurrentrows

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

Parse00.000.000000

Execute10.000.000000

Fetch00.000.000000

total10.000.000000

Misses in library cache during parse: 0

Misses in library cache during execute: 1

Optimizer goal: CHOOSE

Parsing user id: SYS

猜你在找的Oracle相关文章