Oracle 查看执行计划

Oracle 如何查看执行计划

一. 查看方式

1.1. explain plan

先使用explain plan命令对目标SQL做explain,在使用"select * from table(dbms_xplan.display)"查看上述使用explain plan命令后得到的执行计划。
PL/SQL Developer中的快捷键F5就是在explain plan命令上的一层封装。

explain plan for + SQL
select * from table(dbms_xplan.display)

1.2. DBMS_XPLAN

#配合explain plan使用
select * from table(dbms_xplan.display);

#查看刚刚执行过的SQL的执行计划
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));

#只要目标SQL的执行计划所在的Child Cursor没有被age out出Shared Pool
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like '%select * from emp%';
#用于查看指定SQL的执行计划
select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number, 'advanced'));


#VERSION_COUNT代表有几种不同的执行计划
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like '%select * from emp%';
#查看指定SQL的所有历史执行计划,前提是该SQL的执行计划被采集到AWR Repository中
select * from table(dbms_xplan.display_awr('sql_id'));

1.3. SQLPLUS中的AUTOTRACE

set serverout 
set autotrace {off | on | traceonly}
[explain]
[statistics]

1.4. 10046事件

与之前三种查看执行计划方法不同之处在于,所得到的执行计划中明确显示了目标SQL实际执行计划中每一个执行步骤所消耗的逻辑读、物理读和花费的时间。执行计划与明细资源消耗会写入此Session所对应的trace文件中,Oracle会在参数USER_DUMP_DEST所代表的目录下生成这个trace文件。

  • 首先在当前Session中激活10046事件
  • 接着在此Session中执行目标SQL
  • 最后在此Seesion中关闭10046事件
#激活10046事件两种方法
alter session set events '10046 trace name context forever,level 12'
oradebug event 10046 trace name context forever,level 12

#关闭10046事件两种方法
alter session set events '10046 trace name conetxt off'
oradebug event 10046 trace name context off

1.5. 10053事件

1.6. AWR报告

1.7. 脚本

二. 真实执行计划

在Oracle数据库中判断得到的执行计划是否准确,就是看目标SQL是否被真正执行,真正执行过的SQL所对应的的执行计划就是准的,反之则有可能不准。

  • explian plan命令
  • DBMS_XPLAN包
  • SQLPLUS中的AUTOTRACE开关
  • 10046事件

第一种方法可能不准
第二种方法4种方式中第一个方式可能不准,后三种方式都是准的
Alt text
第三种方法可能不准
第四种方法准确

猜你喜欢

转载自blog.csdn.net/w892824196/article/details/84706826