Oracle学习笔记(三)----------执行计划

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

 

1、经过PL/SQL Dev工具c#

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

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

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

 

2、经过sqlplusfetch

1.最简单的办法优化

Sql> set autotrace on命令行

Sql> select * from dual;orm

  执行完语句后,会显示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语句执行的每一个阶段(如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';

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

 

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

 

通常,一次跟踪能够分为如下几步:

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

二、通过一段时间后,中止跟踪。此时应该产生了一个跟踪结果文件。

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

 

--使用一下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

相关文章
相关标签/搜索