分享

通过分析SQL语句的执行计划优化SQL(三)第五章ORACLE的执行计划2

 aaie_ 2011-10-08
5.5如何产生执行计划
       5.6如何分析执行计划

5.5如何产生执行计划

要为一个语句生成执行计划,可以有3种方法:
1).最简单的办法

Sql> set autotrace on
Sql> select * from dual;
执行完语句后,会显示explain plan 与 统计信息。
这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。

如果想得到执行计划,而不想看到语句产生的数据,可以采用:
Sql> set autotrace traceonly
这样还是会执行语句。它比set autotrace on的优点是:不会显示出查询的数据,但是还是会将数据输出到客户端,这样当语句查询的数据比较多时,语句执行将会花费大量的时间,因为很大部分时间用在将数据从数据库传到客户端上了。我一般不用这种方法。

Sql> set autotrace traceonly explain
如同用explain plan命令。对于select 语句,不会执行select语句,而只是产生执行计划。但是对于dml语句,还是会执行语句,不同版本的数据库可能会有小的差别。这样在优化执行时间较长的select语句时,大大减少了优化时间,解决了“set autotrace on”与“set autotrace traceonly”命令优化时执行时间长的问题,但同时带来的问题是:不会产生Statistics数据,而通过tatistics数据的物理I/O的次数,我们可以简单的判断语句执行效率的优劣。


如果执行该语句时遇到错误,解决方法为:
(1)在要分析的用户下:
Sqlplus > @ ?\rdbms\admin\utlxplan.sql
(2) 用sys用户登陆
Sqlplus > @ ?\sqlplus\admin\plustrce.sql
Sqlplus > grant plustrace to user_name;   - - user_name是上面所说的分析用户

2).用explain plan命令
(1) sqlplus > @ ?\rdbms\admin\utlxplan.sql
(2) sqlplus > explain plan set statement_id =’???’ for select ………………
注意,用此方法时,并不执行sql语句,所以只会列出执行计划,不会列出统计信息,并且执行计划只存在plan_table中。所以该语句比起set autotrace traceonly可用性要差。需要用下面的命令格式化输出,所以这种方式我用的不多:

set linesize 150
set pagesize 500
col PLANLINE for a120
SELECT EXECORD EXEC_ORDER, PLANLINE
   FROM (SELECT PLANLINE, ROWNUM EXECORD, ID, RID
       FROM (SELECT PLANLINE, ID, RID, LEV
             FROM (SELECT lpad('' '',2*(LEVEL),rpad('' '',80,''     ''))||
                        OPERATION||''   ''||                 -- Operation
                        DECODE(OPTIONS,NULL,'''',

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多