哪些是真实的执行计划?

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事件生成出来的也是正确的,这里就不在进行测试了。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值