哪些是真实的执行计划?

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;

哪些是真实的执行计划?_第1张图片

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 ;

哪些是真实的执行计划?_第2张图片

 

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);

哪些是真实的执行计划?_第3张图片

 

 

使用set autot trace 生成执行计划对比

set autot trace

selectcount(*) from test1 where object_id between :a and :b ;

 

哪些是真实的执行计划?_第4张图片

 

 

使用 dbms_xplan.display_cursor

select count(*) from test1 where object_idbetween :a and :b ;

select * fromtable(dbms_xplan.display_cursor(null,null,'ADVANCED'));

哪些是真实的执行计划?_第5张图片
哪些是真实的执行计划?_第6张图片

 

 

 

发现,三种执行计划只有display_cursor和其他方式获取的执行计划不一样。其实该执行计划就是正确的。10046事件生成出来的也是正确的,这里就不在进行测试了。

 

 

 

 

你可能感兴趣的:(ORACLE之个人成长记录)