跟这罗老师学
一、获取执行计划的方法
1.DISPLAY_CURSOR方法(真实)
dbms_xplan.display_cursor('sql_id', child number, format)
--child number如果置为NULL,则返回所有子游标的执行计划
--format的格式如下:推荐格式为 'ADVANCED ALLSTATS LAST PEEKED_BINDS'
IOSTATS:显示该游标累计执行的IO统计信息(Buffers, Reads)
MEMSTATS:累计执行的PGA使用信息(Omem 1Mem Used-Mem)
ALLSTATS:OSTATS + MEMSTATS
Advanced:显示outline、Query Block Name、 Column Projection等信息
Typical:不打印PROJECTION, ALIAS
PEEKED_BINDS:打印解析时使用的绑定变量
LAST:仅显示最后一次执行的统计信息
建议步骤:
(1)
alter session set STATISTICS_LEVEL = ALL; --会话级别 (调试的时候可以设置会话级别的)
(2)相同会话执行业务查询语句,并获取sql_id
(3)获取执行计划
select * from table(dbms_xplan.display_cursor('sql_id ',null,'advanced allstats last peeked_binds'));
说明:
当statistics_level设置为typical时也是默认值时,oracle会自动收集用于自我管理和提供最佳性能的重要统计数据。这个值适用于大部分环境。
当statistcs_lever设置为 all时,oracle不但会收集typical的数据,并且在其基础上加上 操作系统定时统计数据,和执行计划。 所以对于问题的诊断,建议在会话级别设置为all
当statistics_lever设置为basic时,oracle不会收集很多重要特性数据,对于性能优化等诊断将会产生重大影响
优点:能显示谓词信息,可以输出更为详细的信息
缺点:具有时效性,仅支持在v$sqlarea中还存在的sql_id
2.DISPLAY_AWR (真实)
select * from table(dbms_xplan.display_awr('sql_id', format=>'all'));
更全的信息:
select * from table(dbms_xplan.display_awr('sql_id',null,null, 'advanced allstats last peeked_binds') )
优点:在快照期内可用,比DISPLAY_CURSOR方法时间长
缺点:不能显示谓词信息
3.SQL TRACE (真实)
当前session :
SQL> alter session set tracefile_identifier='my20210426';
SQL> alter session set sql_trace=true;
SQL> 执行sql
SQL> alter session set sql_trace=false;
会在trace目录下(警告日志所在目录)生成跟my20210426相关的trace文件
4.10046事件(真实)
当前session:
SQL> alter session set tracefile_identifier='my10046';
SQL> alter session set events '10046 trace name context forever, level 12';
SQL> 执行sql
SQL> alter session set events '10046 trace name context off';
会在trace目录下(警告日志所在目录)生成跟my10046相关的trace文件