锤子生物科技 历史秘闻 oraclesql的执行计划如何查看

oraclesql的执行计划如何查看

?oraclesql的执行计划如何查看:   .   一、通过PL/SQL Dev工具   1、直接File-…


?oraclesql的执行计划如何查看:
  .

  一、通过PL/SQL Dev工具

  1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。

  其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。

  2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1 … 。

  注意:PL/SQL Dev工具的mand window中不支持set autotrance on的命令。

  还有使用工具 … 查看计划看到的信息不全,有些时候我们需要sqlplus的支持。

  二、通过sqlplus

  1.最简单的办法

  Sql> set autotrace on

  Sql> select * from dual;

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

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

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

  Sql> set autotrace traceonly

  这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。

  虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决 … 为:

  (1)在要分析的用户下:

  Sqlplus > @ ?

  dbmsadminutlxplan.sql

  (2) 用sys用户登陆

  Sqlplus > @ ?sqlplusadminplustrce.sql

  Sqlplus > grant plustrace to user_name;

  - – user_name是上面所说的分析用户

  2.用explain plan命令

  (1) sqlplus > explain plan for select * from testdb.myuser

  (2) sqlplus > select * from table(dbms_xplan.display);

  上面这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;

  ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG

  ——– —————————————- ———– ———- ————————————————————

  66D83D64 select t.name, (sel 421531 60104 7.01336017

  66D9E8AC select t.schema, t.n 1141739 2732 417.913250

  66B82BCC select s.synonym_nam 441261 6 73543.5

  从而对找出的语句进行进一步优化。

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

  3、启用SQL_TRACE跟踪所有后台进程活动:

  全局参数设置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)

  当前session中设置:

  SQL> alter session set SQL_TRACE=true;

  SQL> select * from dual;

  SQL> alter session set SQL_TRACE=false;

  对其他用户进行跟踪设置:

  SQL> select sid,serial#,username from v$session where username=’XXX’;

  SID SERIAL# USERNAME

  —— ———- ——————

  127 31923 A

  128 54521 B

  开启跟踪:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);

  关闭跟踪:SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);

  然后使用oracle自带的tkprof命令行工具格式化跟踪文件。

  4、使用10046事件进行查询:

  10046事件级别:

  Lv1 – 启用标准的SQL_TRACE功能,等价于SQL_TRACE

  Lv4 – Level 1 + 绑定值(bind values)

  Lv8 – Level 1 + 等待事件跟踪

  Lv12 – Level 1 + Level 4 + Level 8

  全局设定:

  OracleHome/admin/SID/pfile中指定: EVENT=”10046 trace name context forever,level 12″

  当前session设定:

  开启:SQL> alter session set events ‘10046 trace name context forever, level 8’;

  关闭:SQL> alter session set events ‘10046 trace name context off’;

  对其他用户进行设置:

  SQL> select sid,serial#,username from v$session where username=’XXX’;

  SID SERIAL# USERNAME

  —— ———- ——————

  127 31923 A

  SQL> exec dbms_system.set_ev(127,31923,10046,8,’A’);

  5、使用tkprof格式化跟踪文件: (根据下面SQL语句得到的文件都不存在该目录下,郁闷啊,懵懂啊…)

  一般,一次跟踪可以分为以下几步:

  1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪。

  2、经过一段时间后,停止跟踪。

  此时应该产生了一个跟踪结果文件。

  3、找到跟踪文件,并对其进行格式化,然后阅读或分析。

  –使用一下SQL找到当前session的跟踪文件:

  SELECT d.value|| ‘/’ ||lower(rtrim(i.instance, chr( 0 )))|| ‘_ora_’ ||p.spid|| ‘.trc’ trace_file_namefrom( select p.spid from v$mystat m,v$session s, v$process pwhere m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,( select t.instance from v$thread t,v$parameter vwhere v.name = ‘thread’ and (v.value = 0 or t.thread# = to_number(v.value))) i,( select value from v$parameter where name = ‘user_dump_dest’ ) d;– 其它用户的 session SELECT d.value|| ‘/’ ||lower(rtrim(i.instance, chr( 0 )))|| ‘_ora_’ ||p.spid|| ‘.trc’ trace_file_name from ( select p.spid from v$session s, v$process p where s.sid= ’27’ and s. SERIAL#= ’30’ and p.addr = s.paddr) p, ( select t.instance from v$thread t,v$parameter v where v.name = ‘thread’ and (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from v$parameter where name = ‘user_dump_dest’ ) d;

  –查找后使用tkprof命令,将TRACE文件格式为到D盘的explain_format.txt文件中

  SQL> $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc d:/explain_format.txt

  文件内容大致如下(看不太懂….懵懂啊…..天啊….神啊…..过几时就懂了/////////////)

  TKPROF: Release 9.2.0.1.0 – Production on 星期二 4月 20 13:59:20 2010

  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

  Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc

  Sort options: default

  ********************************************************************************

  count = number of times OCI procedure was executed

  cpu = cpu time in seconds executing

  elapsed = elapsed time in seconds executing

  disk = number of physical reads of buffers from disk

  query = number of buffers gotten for consistent read

  current = number of buffers gotten in current mode (usually for update)

  rows = number of rows processed by the fetch or execute call********************************************************************************

  alter session set events ‘10046 trace name context forever, level 8’

  call count cpu elapsed disk query current rows

  ——- —— ——– ———- ———- ———- ———- ———-

  Parse 0 0.00 0.00 0 0 0 0

  Execute 1 0.00 0.00 0 0 0 0

  Fetch 0 0.00 0.00 0 0 0 0

  ——- —— ——– ———- ———- ———- ———- ———-

  total 1 0.00 0.00 0 0 0 0

  Misses in library cache during parse: 0

  Misses in library cache during execute: 1

  Optimizer goal: CHOOSE

  Parsing user id: SYS

本文来自网络,不代表楚门运势网立场,转载请注明出处。版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 153055113@qq.com 举报,一经查实,本站将立刻删除。https://www.chuizmen.com.cn/30469.html

作者: qinlan

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部