初学者之ORACLE生成执行计划

来源:互联网 发布:王小波黑铁时代知乎 编辑:程序博客网 时间:2024/06/16 21:14

1.Explain Plan For SQL

该方法不是SQL语句实际执行后所产生的执行计划,是根据统计信息估算的执行计划,信息来自plan_table。

SCOTT@orcl>explain plan for selecte.ename,e.sal,d.loc,d.deptno from emp e,dept d where e.deptno=d.deptno;

SCOTT@orcl>select * from table(dbms_xplan.display());

 

第二句话是从plan_table里取数据,它只取plan_table里最新的一条语句

 

证实一下:


 

2.SQLPLUS  AUTOTRACE

set  autotrace on|off|traceonly {explain|statistics};

 

set  autotrace on  --实际执行SQL并显示执行结果,显示执行计划与统计信息

set  autotraceoff关闭AUTOTRACE

set  autotrace traceonly显示执行计划与统计信息

set  autotracetraceonly explain显示执行计划

set  autotrace traceonly statistics显示统计信息

 

注:除setautotrace traceonly {explain | statistics}外均实际执行SQL,但仍未必是真实计划,信息来自plan_table

证实一下:


如何打开autotrace功能

1.  创建基础表

     通过运行$ORACLE_HOME/rdbms/admin/utlxplan 脚本完成,该脚本用于创建plan_table表。

并授权给public(公共角色)

grant all on plan_table to public;


2.创建plustrace 角色

     这里需要运行$ORACLE_HOME/sqlplus/admin/plustrce.sql


3.所有用户都可以查看sql执行计划

grant plustrace to public;

3.SQL TRACE(10046和10053)

     可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace 文件来了解在这个SQL执行过程中Oracle 都做了哪些操作。


如何产生trace文件

1) 启动SQL_TRACE

SCOTT@orcl>alter session set sql_trace=true;

 

2) 进行相关事务操作

SCOTT@orcl>select * from emp;

 

3) 关闭SQL_TRACE

SCOTT@orcl>altersession set sql_trace=false


SCOTT@ orcl>col name for a40;

SCOTT@ orcl>col value for a65;

SCOTT@ orcl>select name,value from v$diag_infowhere name like '%Default%';

 

NAME                               VALUE

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

Default Trace File               /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_13629.trc

 

该事件收集的信息也是放在trace文件中,查看trace文件的方法,使用TKPROF 工具(TKPROF工具其实就是一个将文件中的内容进行下格式话处理,使你能看的更舒畅)。

 

$tkprof/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_13629.trc  mytrace

$ls -al mytrace*

$-rw-r--r-- 1 oracle oinstall 28817 Apr 26 17:35mytrace.prf

$more mytrace.prf

证实一下:



两个特殊的跟踪事件10046事件和10053事件

10046事件按照收集信息内容,可以分成4个级别:

         Level1: 等同于SQL_TRACE的功能

         Level4: 在Level 1的基础上增加收集绑定变量的信息

         Level8: 在Level 1 的基础上增加等待事件的信息

         Level12:等同于Level 4+Level 8, 即同时收集绑定变量信息和等待事件信息。

 

SQL>alter session set events '10046 trace namecontext forever, level 12'; --启动10046事件

执行相关事务

SQL>alter session set events '10046 trace namecontext off'; -- 关闭10046事件

 

10053 事件是oracle提供的用于跟踪sql语句成本计算的内部事件,它能记载CBO模式下oracle优化器如何计算 sql成本,生成相应的执行计划。

跟10046跟踪事件不同,10053提供了两个跟踪级别,但是级别2的跟踪信息比级别1少(其他跟踪事件如10046跟踪,级别越高信息越多),

 

如何设置10053事件

设置本session的10053

Alter session set events '10053 trace namecontext forever,level 1';  --启动10053事件

执行相关事务

Alter session set events '10053 trace namecontext off';    -- 关闭10046事件

 

对于SQL_TRACE,一般用tkprof看的更清楚些。

 

$tkprof/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_13629.trc orcl_ora_13629.txt

$ls -al orcl_ora_13629.txt

$-rw-r--r-- 1 oracle oinstall 28817 Apr 26 17:35orcl_ora_13629.txt

$more orcl_ora_13629.txt














0 0