几种常用的获取执行计划的方法


1. explain plan for

set lin 200 pages 2000
explain plan for
sql_text
select * from table (dbms_xplan.display());

优点:无须真正执行,快
缺点:无没有真正的执行,无法获取执行时相关统计信息


2.set autotrace traceonly

set lin 200 pages 2000
set autotrace traceonly
sql_text
set autotrace off

优点:可获取相关执行信息
缺点:需等语句执行完毕才能出结果,无法查看表被访问次数


3.statistics_level=all

alter session set statistics_level=all;
sql_text
select * from table(dbms_xplan.display_cursor(null,null.'allstats last'));

Starts sql执行次数
E-Rows 执行计划预计行数
A-Rows 实际返回行数
A-Time 实际执行时间
Buffers 逻辑读
Reads 物理读

优点:可以看出表访问次数(starts),根据E-Rows,A-Rows可以看出oracle的评估情况。
缺点:需等语句执行完毕,无法屏蔽执行结果的输出。,无法看到物理读情况。


4.dbms_xplan.display_cursor
select * from table(dbms_xplan.display_cursor('sql_id'); (共享池中获取)
select * from table(dbms_xplan.display_awr('sql_id'); (awr性能视图中获取)

优点:知道sql_id,可立即获取真实执行计划
缺点:无输出运行时相关统计信息,无法判断处理行数,及表访问次数。


5.事件10046 trace跟踪
alter session set events '10046 trace name context forever,level 12';(开启)
sql_text(执行)
alter session set events '10046 trace name context off';(关闭)
tkprof trc 跟踪文件 目标文件 sys=no srt=prsela,exeela,fchela(格式化文件)


6.awrsqrpt.sql
@?/rdbms/admin/awrsqrpt.sql

如果sql是曾经执行过,推荐用4.
如果没有执行成功过,推荐用1.
如果执行时间较短,推荐用2

猜你喜欢

转载自www.cnblogs.com/lwq9614/p/13206118.html