您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

ORACLE的执行计划(五)--如何产生执行计划

 

五、如何产生执行计划

要为一个语句生成执行计划,可以有3种方法:

1、最简单的办法

Sql> set autotrace on

Sql> select * from dual;

执行完语句后,会显示explain plan 与 统计信息。

这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。

如果不想执行语句而只是想得到执行计划可以采用:

Sql> set autotrace traceonly

这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,

如果执行该语句时遇到错误,解决方法为:

(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,'','('||OPTIONS || ') ')||  -- Options

DECODE(OBJECT_OWNER,null,'','OF '''|| OBJECT_OWNER||'.')||  -- Owner

DECODE(OBJECT_NAME,null,'',OBJECT_NAME|| ''' ')|| -- Object Name

DECODE(OBJECT_TYPE,null,'','('||OBJECT_TYPE|| ') ')||  -- Object Type

DECODE(ID,0,'OPT_MODE:')||       -- Optimizer

DECODE(OPTIMIZER,null,'','ANALYZED','', OPTIMIZER)||

DECODE(NVL(COST,0)+NVL(CARDINALITY,0)+NVL(BYTES,0),

0,null,' (COST='||TO_CHAR(COST)||',CARD='||

TO_CHAR(CARDINALITY)||',BYTES='||TO_CHAR(BYTES)||')')

PLANLINE, ID, LEVEL LEV,

(SELECT MAX(ID)

FROM PLAN_TABLE PL2

CONNECT BY PRIOR ID = PARENT_ID

AND PRIOR STATEMENT_ID = STATEMENT_ID

START WITH ID = PL1.ID

AND STATEMENT_ID = PL1.STATEMENT_ID) RID

FROM PLAN_TABLE PL1

CONNECT BY PRIOR ID = PARENT_ID

AND PRIOR STATEMENT_ID = STATEMENT_ID

START WITH ID = 0

AND STATEMENT_ID = 'aaa')

ORDER BY RID, -LEV))

ORDER BY ID;

上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化。其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的。此时有许多现成的语句可以找出耗费资源比较多的语句,如:

SELECT ADDRESS,

substr(SQL_TEXT,1,20) Text,

buffer_gets,

executions,

buffer_gets/executions AVG

FROM   v$sqlarea

WHERE  executions>0

AND    buffer_gets > 100000

ORDER BY 5;

从而对找出的语句进行进一步优化。当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划,这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等)。

 

3、用dbms_system存储过程生成执行计划

因为使用dbms_system存储过程可以跟踪另一个会话发出的sql语句,并记录所使用的执行计划,而且还提供其它对性能调整有用的信息。因其使用方式与上面2种方式有些不太一样,所以在附录中单独介绍。这种方法是对SQL进行调整比较有用的方式之一,有些情况下非它不可。具体内容参见附录。


(本文来自网络,如有侵权请来信告知,本站将在第一时间删除。)

 

相关文章 [上一篇] ORACLE的执行计划(四)--表之间的连接
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号