查看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语句执行的每个阶段(如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'); 

你可能感兴趣的:(oracle,sql,优化,session,buffer,工具)