如何得到真实的执行计划
得到目标SQL的执行计划,大致有以下四种方式:
1、explain plan 命令
2、DBMS_XPLAN包
3、SQLPLUS中的autotrace开关
4、10046事件
除了第四种,其他三种方法都有可能是不准的。判断一个sq计划任务任务是否准确,就要看目标SQL是否真正被执行。
对使用第一种方法(即使用 explain Plan 命令)得到的执行计划而言,因为此时目标 SQL 并没有被实际执行,所以用该方法得到的执行计划有可能是不准的,尤其是在日标 SQL 包含绑定变量时.在默认开启绑定变最窥探( Bind Peeking )的情况下,对含绑定变里的目标 sQL 使用 explain plan 得到的执行计划只是一个半成品,Oracle在随后对该 SQL 的绑定变量进行窥探后就得到了这些绑定变量具体的值,此时Oracle很可能会对上述半成品的执行计划做调整,一旦做了调整,使用 explain plan 命令得到的执行计划就不准了。
第二种方法包里含有四种方式,第一种方式是用于查看explain plan命令得到的目标SQL的执行计划,显然是不准确的。所以如下方式:
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced'));
select * from table(dbms_xplan.display_awr('sql_id')); --用于已经被age out 出shared pool的情况
第三种方法(即使SQLPLUS中的AUTOTRACE开关)而言,你可以选执行如下三种方式中的一种来幵启AUTOTRACE开关:
SET AUTOTRACE ON (可以简写为 SET AUTOT ON):
SET AUTOTRACE TRACEONLY (可以简写为 SET AUTOT TRACE);
SET AUTOTRACE TRACEONLY EXPLAIN (可以 简写为 SET AUTOT TRACE EXP );
上述三种方式中,当使用SET AUTOTRACE ON和SET AUTOTRACE TRACEONLY时,目标SQL都已经被实际执行过了,正是因为被实际执行过,所以在SET AUTOTRACE ON和SET AUTOTRACE TRACEONLY的情况下我们能看到到目标SQL的实际资源消耗情况,当使用SET AUTOT TRACE EXP,如果执行的是SELECT语句,则该SELECT语句并没有被Oracle实际执行,但如果执行的是DML语句,情况况就不一样了,此时的DML语句是会被Oracle实际执行的.
如果目标SQL的执行计划还在Shared Pool中,那就可以以使用脚本display_cursor_9i.sql和存储过程printsql来得到其真实的执行计划和资源消耗情况,两个文件的地址是:
http://www.dbsnake.net/wp-content/uploads/2012/08/display_cursor_9i.sql_.txt
http://www.dbsnake.net/wp-content/uploads/2012/08/PRINTSQL.prc_.txt