1.用explain plan for来获取执行计划
explain plan for <sql>; select * from table(dbms_xplan.display());
结果如下:
---------------------------------------------------------------------------------------------------------------------
优点
- 不需要真实执行sql,方便快捷
缺点
- 这里的执行计划并不是真实的执行计划
- 不能获取运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况)
- 无法判断表被访问了多少次
- 无法判断处理了多少行数据
---------------------------------------------------------------------------------------------------------------------
2.用autotrace 来获取执行计划
SET AUTOTRACE OFF --此为默认值,即关闭Autotrace SET AUTOTRACE ON EXPLAIN --只显示执行计划和执行结果 SET AUTOTRACE ON STATISTICS --只显示执行的统计信息和执行结果 SET AUTOTRACE ON --包含执行计划,统计信息和执行结果 SET AUTOTRACE TRACEONLY --只显示执行计划
使用 SET AUTOTRACE ON EXPLAIN 时,显示执行结果,和执行计划,如图:
使用 SET AUTOTRACE ON STATISTICS 时,显示执行结果,和统计信息,如图:
使用 SET AUTOTRACE ON 时,显示执行结果,执行计划和统计信息,如图:
使用 SET AUTOTRACE TRACEONLY 时,显示执行计划和统计信息如图:
---------------------------------------------------------------------------------------------------------------------
优点
- 可以输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
缺点
- 获取的不是真实的执行计划
- 无法看到表被访问了多少次。
---------------------------------------------------------------------------------------------------------------------
3.使用 gather_plan_statistics 获取高级执行计划
--方法1 alter session set statistics_level=all ; sql; select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); --方法2 sql;(sql中加 HINT (gather_plan_statistics)) select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
如图:
---------------------------------------------------------------------------------------------------------------------
优点
- 真实的执行计划
- 能看到表被扫描的次数
- 能看到oracle预测行数和真实返回的行数
- 可以看到逻辑读数
缺点
- 必须等sql真实执行过才能看到执行计划
- 没有统计信息
---------------------------------------------------------------------------------------------------------------------
4.使用10046事件来获取执行计划
alter session set events '10046 trace name context forever,level 12'; SELECT * FROM t1, t2 WHERE t1.id = t2.t1_id AND t1.n IN (18, 19); 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; exit tkprof 源trc文件路径 格式化后路径 格式化参数