怎么获取某个sql语句的执行计划系列二

如何获取某个sql语句的执行计划系列二

如何获取某个sql语句的执行计划系列二


这里介绍另一种较为简单的方法使用SQL*Plus  AUTOTRACE可以轻松捕获sql的执行计划

set autotarce on                 /ENables autotracing SQL statements
              OFF                   /Disables autotracing SQL statements
              TRACE[ONLY]        /Enables autotracing SQL statements and suppresses statement output
              on  EXPLAIN           /Displays execution plans but does not display statistics
              on  STATISTICS        /Displays statistics but does  not display execution plans


确定是否已经启用 autotrace
SHOW AUTOTRACE

eg:
SQL> set autotrace on
SQL> select * from dual;

D
-
X


执行计划
----------------------
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 |
--------------------------------------


统计信息
----------------------
          0  recursive calls
          0  db block gets  ------------当前逻辑i/o的数量
          3  consistent gets --------------从buffer cache 中读的数据块数
          0  physical reads --------------从磁盘读的数据块数
          0  redo size   ---------DML语句产生的redo 的数量
        404  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)       --------内存中排序的数量
          0  sorts (disk)      ------------在磁盘上的temp 空间的排序数
          1  rows processed


note:DB block gets are reads of the current blocks in the buffer cache.
      Sorts should be performed in memory rather than on disk。
  
  

  
  
  
使用dbms_monitor pl/sql包来启用sql跟踪

1》 For your current session:------当前会话级别
SQL> EXEC dbms_monitor.session_trace_enable;
 
  eg:
SQL> EXECUTE dbms_monitor.session_trace_enable
2>  (session_id, serial_id,
3>   waits => TRUE, binds => TRUE );

禁用sql trace :SQL> EXEC dbms_monitor. session_trace_disable;


SQL> EXECUTE dbms_session.set_sql_trace(true);

禁用sql trace:SQL> EXECUTE dbms_sessi on.set_sql_trace(false);

2》For any session:  ----任何会话度可以跟踪
SQL> EXECUTE dbms_monitor.session_trace_enable
   2  (session_id , serial_id, waits, binds );
  
禁用sql trace:SQL> EXECUTE dbms_monit or.session_trace_disable (session_id , serial_id);

  
3》For instance-wide tracing:  -------实例级别
   SQL> EXEC dbms_monitor.database_trace_enable();
  
   注意基于instance-wide tracing级别的trace 会产生大量日志,也会影响系统性能
  
 禁用sql trace: SQL> EXEC dbms_monitor. database_trace_disable();