[ORACLE] ORACLE 查看执行计划 的方式
ORACLE 查看执行计划 的方式
获取方法 |
优点 |
缺点 |
[explain plan for] plsql按F5 explain plan for select * from dual; select * from table(dbms_xplan.display()); |
无需真正执行,快捷方便 |
1.没有输出相关统计信息,例如产生了多少逻辑读,多少次物理读,多少次递归调用的情况; |
[set autotrace on]-sql*plus set autotrace on select * from dual; |
1.可以输出运行时的相关统计信息(产生多少逻辑读、多少次递归调用、多少次物理读等); 2.虽然要等语句执行完才能输出执行计划,但是可以有traceonly开关来控制返回结果不打屏输出; |
1.必须要等SQL语句执行完,才出结果; 2.无法看到表被访问了多少次; |
[statistics_level=all]
alter session set statistics_level=all; set serveroutput off SELECT * FROM TEST01; select * from table
|
1.可以清晰的从starts得出表被访问多少次; 2.可以从E-Rows和A-Rows得到预测的行数和真实的行数,从而可以准确判断Oracle评估是否准确; 3.虽然没有准确的输出运行时的相关统计信息,但是执行计划中的Buffers就是真实的逻辑读的数值; |
1.必须要等执行完后才能输出结果; 2.无法控制结果打屏输出,不像autotrace可以设置traceonly保证不输出结果; 3.看不出递归调用,看不出物理读的数值 |
[dbms_xplan.display_cursor] select * from table(dbms_xplan.display_cursor('04jc5nwr30r01',null,'allstats last')); select * from table( dbms_xplan.display_cursor('&sql_id') ); |
1.知道sql_id即可得到执行计划,与explain plan for一样无需执行; 2.可得到真实的执行计划 |
1.没有输出运行的统计相关信息; 2.无法判断处理了多少行; 3.无法判断表被访问了多少次; |
[事件10046 trace] 步骤1:alter session set events '10046 trace name context forever,level 12'; --开启追踪 |
1.可以看出sql语句对应的等待事件; 2.如果函数中有sql调用,函数中有包含sql,将会被列出,无处遁形; 3.可以方便的看处理的行数,产生的逻辑物理读; 4.可以方便的看解析时间和执行时间; 5.可以跟踪整个程序包 |
1.步骤繁琐; 2.无法判断表被访问了多少次; 3.执行计划中的谓词部分不能清晰的展现出来 |
查看的级别
alter system set statistics_level=all;
alter session set statistics_level=all;
select /*+ gather_plan_statistics*/...
附1 dbms_xplan.display_cursor
ALLSTATS = IOSTATS(IO buffer,Reads)+MEMSTATS(Omem 1Mem Used-Mem)
LAST: 仅显示最后一次执行的统计信息
ADVANCED: 显示 outline,Query Block name,column project 等信息
PEEKED_BINDS: 打印解析时使用的绑定变量
TYPICAL: 不打印PROJECTION,ALIAS
附二,查看SQLID
select sql_id ,sql_text from v$sql where sql_text like '%$SQL%' #$SQL 指你的SQL文本
附三,查看父游标,子游标
#父游标 select * from v$SQLAREA where SQL_ID='' #子游标 select * from v$sql where sql_ID=''; select * from v$sql_plan where sql_ID=''; #plan 查看position,depth,oder ,以作树形图 select * from v$sql_optimizer_env where sql_ID='';#优化环境