zoukankan      html  css  js  c++  java
  • 执行计划生成及查看的几种方法

    1、生成某个会话跟踪文件
    方式1:SQL_trace
    一、跟踪其他会话
    exec dbms_system.set_SQL_trace_in_session(41,49,true);
    exec dbms_system.set_SQL_trace_in_session(7,284,true);
    应用执行一段时间后
    exec dbms_system.set_SQL_trace_in_session(41,49,false);
    exec dbms_system.set_SQL_trace_in_session(7,284,false);
    select value from v$diag_info where name='Default Trace File';
     
    二、跟踪当前会话:
    alter session set sql_trace=true;
    执行具体想要分析的语句
    alter session set sql_trace=false;
    select value from v$diag_info where name='Default Trace File';
    接着
    $tkprof trace文件 将跟踪文件转化为标准格式的分析文件。
     
    方式2:10046事件
    一、跟踪其他会话:
    exec dbms_system.set_ev(16,499,10046,8,'');
    exec dbms_system.set_ev(16,499,10046,0,'');
     
    二、跟踪当前会话
    SQL> alter session set events '10046 trace name context forever,level 12';
    执行具体想要分析的语句
    SQL> alter session set events '10046 trace name context off';
     
    2、查看执行过的语句的执行计划(必须要确保你要查询的sql语句还在shared pool中):
     
    select sql_id from v$sql where sql_text='select count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id';
    select * from table(dbms_xplan.display_cursor('a6hf64s57pz5b',null,'ADVANCED'));
    否则需要语句在awr中记录,按照如下语句查找:
    select * from table(dbms_xplan.display_awr('a6hf64s57pz5b'));
    SELECT * FROM V$sqlarea a WHERE A.SQL_ID='f10pn11qharkx';
     
    3、查看未执行的语句的执行计划:
     
    explain plan for select salary from employees where first_name like 'Pat';
    select * from table(dbms_xplan.display);
     
     
    4、查看正在执行的sql语句的执行计划:
    1、设置Autotrace的命令。
    分别在执行sql前设置set autotrace 的不同参数,得到不同的观察效果
    用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
    --关闭跟踪执行计划和统计信息功能(默认关闭)。
    SQL> set autotrace off;
    --执行计划和统计信息都显示
    SQL> set autotrace on ;
    --只显示执行计划和统计信息,不显示sql执行结果。
    SQL> set autotrace  traceonly;
    --只显示执行计划
    SQL> set autotrace on explain;
    --只显示统计信息
    SQL> set autotrace on  statistics;
    使用autotrace功能时,oracle启用了两个session。
    一个用来执行SQL。另一个用来记录执行计划和输出结果。
     
    2、调优常用获取执行计划的方法( gather_plan_statistics ):
     
    SQL> alter session set statistics_level=all;
     
    SQL> select c1, c2, c3 from subquery_t2 t2
    where c1 >= 20000
    and c1 < 400000
    and exists (select /*+ NO_UNNEST */
    'X'
    FROM SUBQUERY_T1 t1
    where t1.c4 = t2.c1);
     
    SQL>select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
     
    或者下面的方式可省略第一步
     
    select /*+ gather_plan_statistics j1*/ c1, c2, c3
    from subquery_t2 t2
    where c1 >= 20000
    and c1 < 400000
    and exists (select /*+ NO_UNNEST */
    'X'
    FROM SUBQUERY_T1 t1
    where t1.c4 = t2.c1);
     
    SELECT SQL_ID,CHILD_NUMBER FROM V$SQL WHERE SQL_TEXT LIKE '%TEST20180122%' AND SQL_TEXT NOT LIKE '%V$SQL%';
     
    select * from table(dbms_xplan.display_cursor('f7m13v249yp85',0,'allstats last'));
     
     
    3、事件10046 trace跟踪
     
    set autotrace off;
    alter session set statistics_level=typical;
    alter session set events '10046 trace name context forever,level 12';
    执行要分析的sql语句
    alter session set events '10046 trace name context off';
    找到跟踪后产生的文件
    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;
     
    tkprof trc文件 目标文件 sys=no sort=prsela,exeela,fchela
     
    4、10053事件
    alter session set events '10053 trace name context forever,level 1';
    alter session set events '10053 trace name context off';
     
    awrsqrpt.sql 可用来查看某条sql的多个执行计划
     
    也许我已经迷失很久了,早已丢失了自己的影子。
  • 相关阅读:
    mysql 时间戳
    css优先级
    app横竖屏切换
    文本溢出时显示省略号
    react页面间传递参数
    去掉input获取focus时的边框
    Mac中好用的快捷键
    python 图片处理
    CSS padding margin border属性详解
    python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法
  • 原文地址:https://www.cnblogs.com/JcLevy/p/9258234.html
Copyright © 2011-2022 走看看