Oracle执行计划的6种方法

set linesize 400;
set pagesize 20000;

1、类似PLSQL DEVELOPE里的F5
explain plan for select id from GC_OFFSETVCHRITEM where acctyear=2019;
select count(1) from table(dbms_xplan.display());

2、
sqlplus 用户名/密码@10.2.6.29:1521/orcl
set autotrace on;
select count(1) from GC_OFFSETVCHRITEM where acctyear=2019;

set autotrace on (得到执行计划,输出运行结果)
set autotrace traceonly (得到执行计划,不输出运行结果)
set autotrace traceonly explain (得到执行计划,不输出运行结果和统计信息部分,仅展现执行计划部分)
set autotrace traceonl statistics(不输出运行结果和执行计划部分,仅展现统计信息部分)

3、
alter session set statistics_level=all;
select count(1) from GC_OFFSETVCHRITEM where acctyear=2019;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

===========================================================================
总的结论:

一.获取执行计划的6种方法(详细步骤已经在每个例子的开头注释部分说明了):
1. explain plan for获取;
2. set autotrace on ;
3. statistics_level=all;
4. 通过dbms_xplan.display_cursor输入sql_id参数直接获取
5. 10046 trace跟踪
6. awrsqrpt.sql

二.适用场合分析

1.如果某SQL执行非常长时间才会出结果,甚至慢到返回不了结果,这时候看执行计划就只能用方法1;
2.跟踪某条SQL最简单的方法是方法1,其次就是方法2;
3.如果想观察到某条SQL有多条执行计划的情况,只能用方法4和方法6;
4.如果SQL中含有多函数,函数中套有SQL等多层递归调用,想准确分析,只能使用方法5;
5.要想确保看到真实的执行计划,不能用方法1和方法2;
6.要想获取表被访问的次数,只能使用方法3;

*/

----方法1(explain plan for 的方式。类似PLSQL DEVELOPE里的F5)

/*
步骤1:explain plan for "你的SQL"
步骤2:select * from table(dbms_xplan.display());
/
/

优点: 1.无需真正执行,快捷方便

缺陷: 1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
2.无法判断是处理了多少行;
3.无法判断表被访问了多少次。

确实啊,这毕竟都没有真正执行又如何得知真实运行产生的统计信息。
*/

----方法2(set autotrace on 方式)
/*
步骤1:set autotrace on
步骤2:在此处执行你的SQL即可,后续自然会有结果输出

另,有如下几种方式:
set autotrace on (得到执行计划,输出运行结果)
set autotrace traceonly (得到执行计划,不输出运行结果)
set autotrace traceonly explain (得到执行计划,不输出运行结果和统计信息部分,仅展现执行计划部分)
set autotrace traceonl statistics(不输出运行结果和执行计划部分,仅展现统计信息部分)
*/

/*
--优点:1.可以输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
2.虽然必须要等语句执行完毕后才可以输出执行计划,但是可以有traceonly开关来控制返回结果不打屏输出。

--缺陷:1.必须要等到语句真正执行完毕后,才可以出结果;
2.无法看到表被访问了多少次。

*/

----方法3(statistics level=all的方式)
/*
步骤1:alter session set statistics_level=all ;
步骤2:在此处执行你的SQL
步骤3:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

另注:

  1. 如果你用 /*+ gather_plan_statistics */的方法,可以省略步骤1,直接步骤2,3。
  2. 关键字解读(其中OMem、1Mem和User-Mem在后续的课程中会陆续见到):
    Starts为该sql执行的次数。
    E-Rows为执行计划预计的行数。
    A-Rows为实际返回的行数。A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。
    A-Time为每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该sql耗时在了哪个地方。
    Buffers为每一步实际执行的逻辑读或一致性读。
    Reads为物理读。
    OMem:当前操作完成所有内存工作区(Work Aera)操作所总共使用私有内存(PGA)中工作区的大小,
    这个数据是由优化器统计数据以及前一次执行的性能数据估算得出的
    1Mem:当工作区大小无法满足操作所需的大小时,需要将部分数据写入临时磁盘空间中(如果仅需要写入一次就可以完成操作,
    就称一次通过,One-Pass;否则为多次通过,Multi_Pass).该列数据为语句最后一次执行中,单次写磁盘所需要的内存
    大小,这个由优化器统计数据以及前一次执行的性能数据估算得出的
    User-Mem:语句最后一次执行中,当前操作所使用的内存工作区大小,括号里面为(发生磁盘交换的次数,1次即为One-Pass,
    大于1次则为Multi_Pass,如果没有使用磁盘,则显示OPTIMAL)
    OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。
    0/1/M 为最优/one-pass/multipass执行的次数。Used-Mem耗的内存

*/

----方法4(知道sql_id后,直接带入的方式,简单,就步骤1)

/*

步骤1: select * from table(dbms_xplan.display_cursor('&sq_id')); (该方法是从共享池里得到)

注:

  1. 还有一个方法,select * from table(dbms_xplan.display_awr('&sq_id'));(这是awr性能视图里获取到的)
  2. 如果有多执行计划,可以用类似方法查出
    select * from table(dbms_xplan.display_cursor('cyzznbykb509s',0));
    select * from table(dbms_xplan.display_cursor('cyzznbykb509s',1));

*/
(5)事件10046 trace跟踪

步骤1:alter session set events '10046 trace name context forever,level 12'; --开启追踪
步骤2:执行sql语句;
步骤3:alter session set events '10046 trace name context off'; --关闭追踪
步骤4:找到跟踪后产生的文件(开启10046前先用‘ls -lrt’看一下文件,执行结束后再看哪个是多出来的文件即可)
步骤5:tkprof trc文件 目标文件 sys=no sort=prsela,exeela,fchela --格式化命令

详细demo可见《附录1:10046追踪demo》

优点:1.可以看出sql语句对应的等待事件;
2.如果函数中有sql调用,函数中有包含sql,将会被列出,无处遁形;
3.可以方便的看处理的行数,产生的逻辑物理读;
4.可以方便的看解析时间和执行时间;
5.可以跟踪整个程序包
缺点:1.步骤繁琐;
2.无法判断表被访问了多少次;
3.执行计划中的谓词部分不能清晰的展现出来

(6)awrsqrpt.sql

步骤1:@?/rdbms/admin/awrsqrpt.sql
步骤2:选择你要的断点(begin snap和end snap)
步骤3:输入要查看的sql_id

详细demo可见《附录2:使用awrsqrpt.sql查看执行计划》

看懂执行计划:
查看视频教程地址:http://www.tudou.com/programs/view/9HohzhJQZaI
前半部分如何查询执行计划

到 42分50秒:左右开始将执行计划的树形结构。隐藏列,每列的名字,含义。
85分24秒 讲实例

参考https://blog.csdn.net/s630730701/article/details/78940202
https://blog.csdn.net/sinat_28472983/article/details/82382239

你可能感兴趣的:(Oracle执行计划的6种方法)