Oracle数据库里通常可以使用以下四种方法来得到目标SQL的执行计划:
Ø Explain plan for SQL
Ø Sqlplus autotrace
Ø Sql trace(10046)
Ø DBMS_XPLAN
在这四种方法中,只有10046事件看到的执行计划是准确无误的,其他三种执行计划都有可能是不准确的。
在ORACLE数据库中执行计划是否准确,主要是看目标SQL是否被真实的执行,真正执行过的SQL所对应的执行计划才是准确的,反之则有可能不准确。
(这里指其他三种只是有可能不准确,得看具体情况来定。如:dbms_xplan.方法中(DISPLAY_CURSOR和DISPLAY_AWR)得到的SQL就是准确的,因为都是SQL执行过后得到的执行计划)
注:以后只要使用了绑定变量的SQL 除了使用10046事件来查看执行计划以外,其他的方法来看执行计划都有可能不准,但如果SQL没有使用绑定变量,一般来说其他方法都是适用的。
真实执行计划验证
创建一张测试表
create table test1 as select * from dba_objects;
insert into test1 select * from test1;
commit;
select count(*) from test1;
创建一个索引,并收集对应的统计信息
create index idx_test1 on test1(object_id);
exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'test1',estimate_percent=>100,cascade=>true);
配置变量,生成执行计划
var a number;
var b number;
exec :a :=0;
exec :b :=100000;
select count(*) from test1 where object_idbetween :a and :b ;
explain plan for select count(*) from test1 whereobject_id between :a and :b;
select * from table(dbms_xplan.display);
SCOTT@orcl>select * fromtable(dbms_xplan.display);
使用set autot trace 生成执行计划对比
set autot trace
selectcount(*) from test1 where object_id between :a and :b ;
使用 dbms_xplan.display_cursor
select count(*) from test1 where object_idbetween :a and :b ;
select * fromtable(dbms_xplan.display_cursor(null,null,'ADVANCED'));
发现,三种执行计划只有display_cursor和其他方式获取的执行计划不一样。其实该执行计划就是正确的。10046事件生成出来的也是正确的,这里就不在进行测试了。