set autotrace打印出来的执行计划不一定准确

http://blog.csdn.net/robo23/article/details/42616067

文章里简单地比较了EXPLAIN PLAN FOR和SET AUTOTRACE的方法来打印执行计划。

但偶然的机会我发现SET AUTOTRCE尽管有真实去执行SQL,但打印出来的执行计划并不一定准确。看如下实验:

T表有10万条记录,A字段有普通索引,A字段的选择性很好:

<span style="font-size:14px;">SQL> set autotrace on;
SQL> alter session set events '10046 trace name context forever,level 12';  <<<<

Session altered.

SQL> variable a number;
SQL> execute :a := 99999; <<<<<<<

PL/SQL procedure successfully completed.

SQL> select /*bind_peek*/count(b) from t where a < :a; <<<<<<<<<<
  COUNT(B)
----------
     99998

Execution Plan
----------------------------------------------------------
Plan hash value: 3565334791

----------------------------------------------------------------------------------------
| Id  | Operation      | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |     1 |     8 |     5  (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |        |     1 |     8 |     |        |
|   2 |   TABLE ACCESS BY INDEX ROWID| T       |  5000 | 40000 |     5  (0)| 00:00:01 |
|*  3 |    <strong>INDEX RANGE SCAN</strong>      | IND_T_A |   900 |       |     3  (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("A"<TO_NUMBER(:A))

Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
185  consistent gets
  0  physical reads
  0  redo size
528  bytes sent via SQL*Net to client
524  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed

SQL> oradebug tracefile_name;
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_24324.trc   <<<<<<<<</span>

接下来,我们去检查一下trace文件内容:

trace文件里清楚地标识着执行计划是走全表扫描,与SET AUTOTRACE打印出来的路径有出路。

再来看以下两处说明:

图一:

图二:

图一说明,SET AUTOTRACE确实有去执行SQL;图二说明,SET AUTOTRACE的执行计划仍然来至于EXPLAIN PLAN.

这才恍然大悟,SET AUTOTRACE打印出来的执行计划也有可能是不准确的,还是10046最准确。

时间: 2024-10-25 22:24:55

set autotrace打印出来的执行计划不一定准确的相关文章

简单对比查看执行计划的两种方法EXPLAIN PLAN 和 AUTOTRACE

EXPLAIN PLAN 和 AUTOTRACE 都可以查看执行计划. 值得一提的是:前者只是优化器通过读取数据字典的统计信息做出'最佳'访问路径判断,并没有真正去执行语句:后者是实际去执行了SQL语句,同时把访问记录数.执行计划.统计信息等打印出来. 下面粘出实验结果加以说明,注意对比两者的耗时: <p>SQL> CONNECT /AS SYSDBA Connected.</p><p>SQL> SET LINESIZE 300; SQL> SET T

oracle查看执行计划

方法一: SQL> explain plan for select name from a,b where a.id=b.id; 已解释. SQL> select * from table(DBMS_XPLAN.DISPLAY); 方法二: SQL> set autotrace on explain;    //打开执行计划 SQL> select name from a,b where a.id=b.id; 查看结束后,记得关闭执行计划 SQL> set autotrace

Oracle获取执行计划方法

获取执行计划的6种方法 1. explain plan for获取: 2. set autotrace on : 3. statistics_level=all; 4. 通过dbms_xplan.display_cursor输入sql_id参数直接获取 5. 10046 trace跟踪 6. awrsqrpt.sql 适用场合分析 1.如果某SQL执行非常长时间才会出结果,甚至慢到返回不了结果,这时候看执行计划就只能用方法1: 2.跟踪某条SQL最简单的方法是方法1,其次就是方法2,方法2要执行

如何得到真实的执行计划

通常,我们可以使用如下四种方法来得到目标sql的执行计划: (1)explain plan命令 (2)dbms_xplan包 (3)sqlplus中的autotrace开关 (4)10046事件 这其中除了第四种方法之外,其他三种方法得到的执行计划都可能是不准确的.在oracle数据库中判断得到的执行计划是否准确,就是看目标sql是否被真正执行,真正执行过的sql所对应的执行计划就是准确的,反之则可能不准.注意,这里判断原则从严格意义上来说并不适用于autotrace开关,因为所有使用autot

[z]Oracle性能优化-读懂执行计划

http://blog.csdn.net/lifetragedy/article/details/51320192 Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain [sql] view plain copy explain plan set STATEMENT_ID='testplan' for select * from dual; [sql] view plain copy select lpad(' ',5*(level-1))||operation

Oracle性能优化-读懂执行计划

Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * from dual; select lpad(' ',5*(level-1))||operation operation, options, object_name, cost,position from plan_table start with id=0 and STATEMENT_ID='test

Oracle 执行计划(Explain Plan) 说明

http://blog.csdn.net/tianlesoftware/article/details/5827245 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题. 看懂执行计划也就成了SQL优化的先决条件. 这里的SQL优化指的是SQL性能问题的定位,定位后就可以解决问题. 一.         查看执行计划的三种方

oracle 执行计划的获取方法

1.用explain plan for来获取执行计划 explain plan for <sql>; select * from table(dbms_xplan.display()); 结果如下: --------------------------------------------------------------------------------------------------------------------- 优点 不需要真实执行sql,方便快捷 缺点 这里的执行计划并不

最权威Oracle获取SQL执行计划大全

该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅使用,因本人未发现本博客支持附件上传功能,需要PDF文件格式的朋友可向我要,也可到群里下载,转载请注明出处. 1.查询v$sql_plan: SQL> col "Query Plan_Table" format a100 SQL> select id,lpad(' ', 2*(