梅州人才网

Oracle 获取执行计划的几种方法

    发布时间:2019-09-17

    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方法。

    回复:

      查看Oracle执行计划的几种方法
      一、通过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工具的Command 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_name
      from
      ( select p.spid from v$mystat m,v$session s, v$process p
      where m.statistic# = 1 and s.sid = m.sid 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;
      -- 其它用户的 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

    回复:

    查看Oracle执行计划的几种方法 一、通过PL/SQL Dev工具 1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。 2、先执行 EXPLAIN PLAN FOR sel...

    回复:

    1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。 2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from ta...

    回复:

    如何使用ems sql manager for mysql 1# 双击即可安装还有参考帖子:一个优秀的MySQL客户端工具---EMS SQL Manager for MySQL 介绍

    回复:

    你可以在plsql中看sql语句的执行计划,在plsql中,输入完sql语句后,按F5,则会出现sql语句的执行计划和耗费的成本。

    回复:

    1、show parameter job_queue_processes; 2、select * from user_jobs;--查看当前用户的调度任务 3、select * from dba_jobs_running;--查看正在执行的调度任务 4、select * from dba_jobs;--查看执行完的调度任务 5、select * from all_jobs; -...

    回复:

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。 看懂执行计划也...

    回复:

    在日常基于数据库应用的开发过程中,我们经常需要对多个表或者数据源进行关联查询而得出我们需要的结果集。那么Oracle到底存在着哪几种连接方式?优化器内部又是怎样处理这些连接的?哪种连接方式又是适合哪种查询需求的?只有对这些问题有了清...

    回复:

    查看Oracle执行计划的几种方法 一、通过PL/SQL Dev工具 1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。 2、先执行 EXPLAIN PLAN FOR sel...

    回复:

    select t.sql_id, t.sql_text, s.plan_hash_value, s.optimizer_cost, s.executions_total, s.elapsed_time_total, s.disk_reads_total, s.buffer_gets_total from DBA_HIST_SQLSTAT s, DBA_HIST_SQLTEXT t where s.sql_id=t.sql_id and t.sql_t...

    回复:

    安装一个 si objectbrowser 8老版本,能直接看。

    上一篇:奇骏的电动尾门怎么用? 下一篇:中国有没有steam在线客服

    返回主页:梅州人才网

    本文网址:http://0753job.cn/view-208162-1.html
    信息删除