怎么查看存储过程的执行计划
执行计划的查看和分析
执行计划的查看和分析
1. 如何获得执行计划
要为一个语句生成执行计划,可以有3种方法:
1.1. autotrace
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是上面所说的分析用户
1.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 executions0 AND buffer_gets 100000 ORDER BY 5;
从而对出的语句进行进一步优化。当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划,这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等)。
1.3. dbms_system存储过程
因为使用dbms_system存储过程可以跟踪另一个会话发出的sql 语句,并记录所使用的执行计划,而且还提供其它对性能调整有用的信息。因其使用方式与上面2种方式有些不太一样,所以在附录中单独介绍。这种方法是对SQL进行调整比较有用的方式之一,有些情况下非它不可。具体内容参见附录。
1.4. PL/SQL工具
如果在PL/SQL中使用选择要查询语句显示执行计划,则只需要SQL WINDOWS 窗口里面输入要查询的SQL语句,然后选择按键F5或者在菜单TOOLSExplain Plan 菜单按键就可以在执行计划窗
口查看该语句的执行计划。
2. 如何读取执行计划
总体原则:先右后左、先上后下。
实例:表名temp,表中现有1005条记录,包含有多个字段,其中(id1, id2) 为主键, 同时id1, id2 两字段本身的值均是唯一分布的.主键名为temp_u1
2.1. 单表访问的执行计划(1)
语句: select * from temp; 执行计划:
2.2. 单表访问的执行计划(2)
语句: select * from temp where id2=130; 执行计划:
2.3. 单表访问的执行计划(3)
语句: select * from temp where id1=130; 执行计划:
单表访问的执行计划(4) 语句:
select * from temp where id1=130 and id2=130; 执行计划:
2.4. 双表关联访问的执行计划(rbo)
语句:
select t.name, t1.name from temp t, temp1 t1 where t.id1=t1.id1 and t.id2=t1.id2 and t.id1=105 and t.id2=105; 执行计划
(rbo):
2.5. 双表关联访问的执行计划(cbo)
语句:
sql存储过程实例select t.name, t1.name from temp t, temp1 t1 where t.id1=t1.id1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论