基于Oracle的SQL优化--学习(六)

    如何得到真实的执行计划

        得到目标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

如果目标sql的执行计划已经被age out出shared pool,可以执行DBMS_XPLAN.DISPLAY_AWR或者使用AWR SQL报告和statspack sql报告来得到历史执行计划和资源消耗。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值