Oracle 查看SQL的执行计划

  Oracle 查看SQL的执行计划

1、直接产生执行计划
SQL> set autotrace on explain
SQL> select * from dual;

D
-
X

Execution Plan
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

SQL> set autotrace off

这样执行方便,但是当遇到执行时间长的SQL就变得不太现实,它是先产生结果再生成执行计划的。

关于Autotrace几个常用选项的说明:

SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN --------- AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS ------ 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY -----------同set autotrace on,但是不显示查询输出

在10G之前的版本中,需要单独创建PLAN_TABLE并授予权限,10g中自动创建PLAN_TABLE$不再需要这一步骤。
10g之前初始化PLAN_TABLE需要创建的步骤:
SQL> @?/rdbms/admin/utlxplan.sql
SQL> create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;

在10G中,用到的是数据字典PLAN_TABLE$而不是PLAN_TABLE表,
SQL> SET AUTOTRACE TRACEONLY;
SQL> select * from plan_table;


Execution Plan
----------------------------------------------------------
Plan hash value: 103984305

---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |     5 | 55405 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| PLAN_TABLE$ |     5 | 55405 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------

Note
-----
  - dynamic sampling used for this statement 


2、利用explain plan for语句产生执行计划
SQL> explain plan for select * from dual;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.

SQL>
这样可以直接产生执行计划,没有产生SQL结果,应该相当于SQL SERVER中的预执行计划。 

另一种方式就是利用$ORACLE_HOME/rdbms/admin目录下的utlxplp.sql查看执行计划;
其实u tlxplp.sql文件中就存在一个语句: select * from table(dbms_xplan.display);
例如:
SQL> explain plan for select count(*) from dual;

Explained.

SQL> @?/rdbms/admin/utlxplp.sql

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------

Plan hash value: 3910148636

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |      |     1 |            |          |
|   2 |   FAST DUAL      |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

9 rows selected.

SQL>

3、启用sql_trace跟踪所有后台进程活动
查看全局SQL_TRACE参数:
SQL> show parameter sql_trace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sql_trace                            boolean     FALSE

全局参数要求在参数文件中设定数据库重启生效或通过alter system命令设定:
SQL> alter system set sql_trace=true scope=both;

System altered.

SQL> show parameter sql_trace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sql_trace                            boolean     TRUE
SQL>

启用会话级的SQL_TRACE跟踪
SQL> alter session set sql_trace=true;

Session altered.

SQL> select count(*) from dual;

 COUNT(*)
----------
        1

SQL> alter session set sql_trace=false;

Session altered. 

对其他用户进行跟踪
SQL> select sid,serial#,username from v$session where username='MYUSER';

      SID    SERIAL# USERNAME
---------- ---------- ------------------------------
      143          5 MYUSER

SQL> exec dbms_system.set_SQL_TRACE_in_session(143,5,true);

PL/SQL procedure successfully completed.

SQL> exec dbms_system.set_SQL_TRACE_in_session(143,5,false);

PL/SQL procedure successfully completed. 

最后可以得用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 

全局设定格式,在参数文件加入:
EVENT='10046 trace name context forever,level 12';

当前session的设定:
SQL> alter session set events '10046 trace name context forever, level 8';

Session altered.

SQL> select * from dual;

D
-
X

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

Session altered. 

跟踪其他用户:
SQL> select sid,serial#,username from v$session where username='MYUSER';

      SID    SERIAL# USERNAME
---------- ---------- ------------------------------
      142         71 MYUSER
      143          5 MYUSER

SQL> exec dbms_system.set_ev(143,5,10046,8,'A');

PL/SQL procedure successfully completed.

SQL> select * from dual;

D
-
X

SQL> exec dbms_system.set_ev(143,5,10046,0,'A');

PL/SQL procedure successfully completed. 

5、使用tkprof格式化跟踪文件
查看当前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   ;

--当前会话
SQL> SELECT    d.VALUE
 2        || '\'
 3        || LOWER (RTRIM (i.INSTANCE, CHR (0)))
 4        || '_ora_'
 5        || p.spid
 6        || '.trc' trace_file_name
 7   FROM (SELECT p.spid
 8           FROM v$mystat m, v$session s, v$process p
 9          WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
10        (SELECT t.INSTANCE
11           FROM v$thread t, v$parameter v
12          WHERE v.NAME = 'thread'
13            AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
14        (SELECT VALUE
15           FROM v$parameter
16          WHERE NAME = 'user_dump_dest') d;

TRACE_FILE_NAME
------------------------------------------------------------------------------------

C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_3868.trc 

查看其他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   =   '143'   AND   s   .   serial#   =   '5'   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
SQL> SELECT    d .VALUE
 2        || '\'
 3        || LOWER (RTRIM ( i .INSTANCE, CHR ( 0 )))
 4        || '_ora_'
 5        || p . spid
 6        || '.trc' trace_file_name
 7    FROM (SELECT p . spid
 8            FROM v$session s , v$process p
 9           WHERE s .SID = '143' AND s . serial# = '5' AND p . addr = s . paddr ) p ,
10         (SELECT t .INSTANCE
11            FROM v$thread t , v$parameter v
12           WHERE v .NAME = 'thread'
13             AND ( v .VALUE = 0 OR t . thread# = TO_NUMBER ( v .VALUE))) i ,
14         (SELECT VALUE
15            FROM v$parameter
16           WHERE NAME = 'user_dump_dest' ) d ;

TRACE_FILE_NAME
---------------------------------------------------------------------------------------------

C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_3812.trc 


5、利用tkprof工具格式化跟踪文件
SQL> host tkprof C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_3868.trc F:\test\3868.txt

TKPROF: Release 10.2.0.4.0 - Production on Fri Sep 10 11:18:10 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.



SQL> host tkprof C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_3812.trc F:\test\3812.txt

TKPROF: Release 10.2.0.4.0 - Production on Fri Sep 10 11:18:37 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.



--The End---

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9932141/viewspace-677386/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9932141/viewspace-677386/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值