怎么使用plsql查看sql执行时间执行计划

本帖子已过去太久远了,不再提供回复功能。查看: 44091|回复: 4
谁教我怎么在PLSQL看执行计划还有看执行效率
论坛徽章:2
我看如果复杂的SQL&&版主都会说贴上执行计划 ,看执行效率 ,我想请问下 如果看执行计划,如何看执行效率啊
论坛徽章:1088
这个暂且没有法教你,买本 基于oracle的sql优化&&去看看吧
论坛徽章:737
F 5.,先体验下
论坛徽章:115
认证徽章论坛徽章:284
读执行计划,ML有个不错的视频:
如何看执行效率,这个就是路漫漫其修远兮
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号2010年9月 Oracle大版内专家分月排行榜第二
2011年4月 Oracle大版内专家分月排行榜第三2011年3月 Oracle大版内专家分月排行榜第三2011年1月 Oracle大版内专家分月排行榜第三
2010年9月 Oracle大版内专家分月排行榜第二
2011年4月 Oracle大版内专家分月排行榜第三2011年3月 Oracle大版内专家分月排行榜第三2011年1月 Oracle大版内专家分月排行榜第三
2010年9月 Oracle大版内专家分月排行榜第二
2011年4月 Oracle大版内专家分月排行榜第三2011年3月 Oracle大版内专家分月排行榜第三2011年1月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。博客访问: 4649509
博文数量: 501
注册时间:
认证徽章:
Oracle数据库管理员,Oracle数据库系统构架员;2012年7月出版《构建最高可用Oracle数据库系统:Oracle 11gR2 RAC管理、维护与性能优化》一书;Oracle 10g OCM。
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
1.SQL*PLUS AUTOTRACE:
为使所有的用户都能用到SQLPLUS AUTOTRACE,需要做以下操作。
SQL> @?/rdbms/admin/utlxplan.sql
Table created.
SQL> create or replace public synonym plan_table for plan_
Synonym created.
SQL> grant all on plan_
Grant succeeded.
SQL> @?/sqlplus/admin/plustrce.sqlSQL>SQL>drop role plustrace&&&&&&&&& *ERROR at line 1:ORA-01919: role 'PLUSTRACE' does not exist
Role created.
SQL>SQL> grant select on v_$
Grant succeeded.
SQL> grant select on v_$s
Grant succeeded.
SQL> grant select on v_$
Grant succeeded.
SQL> grant plustrace to d
Grant succeeded.
SQL>SQL> set echo offSQL> grant
Grant succeeded.
SQL> connect test/testConnected.SQL> set autotrace onSQL>
AUTOTRACE选项:Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]SET AUTOTRACE ON;SET AUTOTRACE TRACE EXPLAIN;SET AUTOTRACE TRACE EXPLAIN STATISTICS;
启用AUTOTRACE功能,会在一个服务器进程对应2个会话,一个查询数据,一个记录执行计划和最终结果。SQLPLUS AUTOTRACE 是基于PLAN_TABLE表的方法来查询执行计划,内部实现其实和下面要讲到的方法相同:
EXPLAIN PLAN FOR SELECT * FROM TABLE_NAME;SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY(format=>'BASIC'));
2.其实下面要说到的方法已经在说SQLPLUS AUTOTRACE时说到了,EXPLAIN PLAN FOR 与DBMS_XPLAN的结合。
EXPLAIN PLAN [SET statement_id='xxx'] FOR SELECT * FROM TABLE_NAME;SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY);加入SET statement_id='xxx'可以使plan_table存放多个执行计划。获取执行计划除了使用dbms_xplan.display外,还可以通过执行utlxpls.sql //显示串行查询的计划结果utlxplp.sql //显示并行查询的计划结果使用这种方法也是基于PLAN_TABLE表来完成。实际和SQLPLUS AUTOTRACE是一样的。
3.下面这种方法是直接查询V$SQL_PLAN表,直接查询V$SQL_PLAN没有进行很好的格式化,看起来不太方便,ORACLE 10g开始提供了新的包来很好的格式化了V$SQL_PLAN的结果。也是第4种查询方法。
4.DBMS_XPLAN.DISPLAY_CURSORSELECT * FROM TABLE_NAME;SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
普通用户要使用DBMS_XPLAN.DISPLAY_CURSOR的话需要如下视图的权限:grant select on v_$grant select on v_$sql_grant select on v_$
这种实现和直接查询V$SQL_PLAN是相同的。
OK,到这步需要提到一个问题了,我们观察第一种和第二种方法是基于PLAN_TABLE表来生成的执行计划,第三种和第四种方法是基于V$SQL_PLAN视图来生成的执行计划的。通过实际和一些论坛上的经验发现对于一条SQL,这2种查询执行计划的结果是有可能不同的。当然第三种和第四种查询的执行计划是真实LIBRARY CACHE中真实的执行计划。而第一种和第二种方法生成的执行计划可以认为是预判断出来的。所以我们在实际的生产环境中有时候会遇到,在SQLPLUS中执行的速度很快,一旦用到存储过程或程序里面就会变得奇慢,很可能就是因为执行计划不同造成的。我们通过监控会发现2者生成的执行计划完全不同,具体执行时生成了错误的执行计划。这种情况有可能是由于参数CURSOR_SHARING=FORCE或者索引等造成的执行计划错误。
另外,通过DBMS_XPLAN.DISPLAY_AWR函数获取的执行计划来自DBA_HIST_SQL_PLAN视图,通过历史数据记录,甚至一些被老化的SQL执行计划仍然可以被查到
还可以加入一些参数值:SQL> desc dbms_FUNCTION DISPLAY RETURNS DBMS_XPLAN_TYPE_TABLE&Argument Name&&&&&&&&&&&&&&&&& Type&&&&&&&&&&&&&&&&&&& In/Out Default?&------------------------------ ----------------------- ------ --------&TABLE_NAME&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULT&STATEMENT_ID&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULT&FORMAT&&&&&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULT&FILTER_PREDS&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULTFUNCTION DISPLAY_AWR RETURNS DBMS_XPLAN_TYPE_TABLE&Argument Name&&&&&&&&&&&&&&&&& Type&&&&&&&&&&&&&&&&&&& In/Out Default?&------------------------------ ----------------------- ------ --------&SQL_ID&&&&&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&PLAN_HASH_VALUE&&&&&&&&&&&&&&& NUMBER(38)&&&&&&&&&&&&& IN&&&& DEFAULT&DB_ID&&&&&&&&&&&&&&&&&&&&&&&&& NUMBER(38)&&&&&&&&&&&&& IN&&&& DEFAULT&FORMAT&&&&&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULTFUNCTION DISPLAY_CURSOR RETURNS DBMS_XPLAN_TYPE_TABLE&Argument Name&&&&&&&&&&&&&&&&& Type&&&&&&&&&&&&&&&&&&& In/Out Default?&------------------------------ ----------------------- ------ --------&SQL_ID&&&&&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULT&CURSOR_CHILD_NO&&&&&&&&&&&&&&& NUMBER(38)&&&&&&&&&&&&& IN&&&& DEFAULT&FORMAT&&&&&&&&&&&&&&&&&&&&&&&& VARCHAR2&&&&&&&&&&&&&&& IN&&&& DEFAULT
SELECT plan_table_output FROM TABLE (DBMS_XPLAN.DISPLAY('PLAN_TABLE','NO','ALL'));SELECT plan_table_output FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR('',2,'ALL')); //ALL对应的是FORMAT,有BASIC,TYPICAL,SERIAL,ALL几个值,每个值对应显示的内容不同,ALL显示的内容最详尽。默认是TYPICAL,SERIAL和TYPICAL显示是相同的,只是SERIAL去掉了对并行的显示。SELECT plan_table_output FROM TABLE (DBMS_XPLAN.AWR(''));如果要让普通用户能够使用dbms_xplan.display_cursor和dbms_xplan.display_awr的话需要给普通用户授予SELECT_CATALOG角色。
5.SQL TRACE启用:alter session set sql_trace=禁用:alter session set sql_trace=
跟踪其他用户:exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,SQL_TRACE);
6.诊断事件(10046)启用:alter session set events '10046 trace name context forever,level 12';禁用:alter session set events '10046 trace name context off';
启用其他用户10046诊断:exec DBMS_SYSTEM.SET_EV(SI,SE,EV,LE,NM);
开启:exec DBMS_SYSTEM.SET_EV(46,12,'');关闭:exec DBMS_SYSTEM.SET_EV(46,0,'');
另外如何查看是否启用了10046事件:SQL> alter session set events '10046 trace name context forever ,level 12';
Session altered.
SQL> oradebug setmypidStatement processed.SQL> oradebug tracefile_name/u01/app/oracle/db_1/rdbms/log/test_ora_5529.trcSQL> oradebug eventdump session10046 trace name CONTEXT level 12, forever
7.使用oracle第三方工具:plsql developer(F5)Toad (Ctrl+E)
阅读(4401) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
之前一直不知道怎么回答你这个问题,因为我也不太明白。
现在总算明白点了,更新了一下这篇文章,希望你能看到对你有所帮助。
谢谢你的支持!
原帖由Guest于 19:35:45发表
这些方式各自有什么优缺点,适用于什么场景呢?
请登录后评论。}

我要回帖

更多关于 plsql的执行计划 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信