小乔 发表于 2018-9-13 12:14:00

Oracle 执行计划

  查看执行计划的方法:
  1.Explain Plan For SQL
  不实际执行SQL诧句,生成的计划未必是真实执行的计划
  必须要有plan_table
  2.SQLPLUS AUTOTRACE
  除set autotrace traceonly explain外均实际执行SQL,但仍未必是真实计划必须要有plan_table
  3.SQL TRACE
  需要启用10046戒者SQL_TRACE
  一般用tkprof看的更清楚些,当然10046里本身也有执行计划信息
  4.V$SQL和V$SQL_PLAN
  可以查询到多个子游标的计划信息了,但是看起来比较费劲
  5.Enterprise Manager
  可以图形化显示执行计划,但并非所有环境有EM可用
  6.其他第三方工具
  注意 PL/SQL developer之类工具F5看到的执行计划未必是真实的
  
  查看详细执行计划:
  alter session set STATISTICS_LEVEL = ALL; --不设置无法获得A-ROWS等信息
  如果输入NULL 则默认为之前运行的一条SQL,但注意要保持set serveroutput off,否则最后一句SQL将丌是你运行的SQL:
  alter session set STATISTICS_LEVEL = ALL;
  set serveroutput off;
  select * From DATA_SKEW_HB where source='Maclean Search';
  SQL> select * from TABLE(dbms_xplan.display_cursor('fk641nh8gjzvk',NULL,'ADVANCED +PEEKED_BINDS'));
  SQL> select * from table(dbms_xplan.DISPLAY_CURSOR(null, null, 'ALLSTATS'));
PLAN_TABLE_OUTPUT  
--------------------------------------------------------------------------------------
  
SQL_ID dyysbpz0y6aw2, child number 0
  
-------------------------------------
  
select * From DATA_SKEW_HB where source='Maclean Search'
  
Plan hash value: 2604078056
  
--------------------------------------------------------------------------------------------

  
|>  
--------------------------------------------------------------------------------------------
  
| 0 | SELECT STATEMENT | | 1 | | 2000 |00:00:00.02 | 4378 |
  
|* 1 | TABLE ACCESS FULL| DATA_SKEW_HB | 1 | 370 | 2000 |00:00:00.02 | 4378 |
  
--------------------------------------------------------------------------------------------

  
Predicate Information (identified by operation>  
---------------------------------------------------
  
1 - filter("SOURCE"='Maclean Search')
  
alter session set STATISTICS_LEVEL = TYPICAL;
  
E-Rows 是优化器评估返回的行数
  
A-Rows 是实际执行时返回的行数
  
  格式:
  ALLSTATS IOSTATS + MEMSTATS
  IOSTATS 显示该游标累计执行的IO统计信息(Buffers, Reads)
  MEMSTATS 累计执行的PGA使用信息(Omem 1Mem Used-Mem)
  LAST 仅显示最后一次执行的统计信息
  Advanced 显示outline、Query Block Name、 Column Projection等信息
  PEEKED_BINDS 打印解析时使用的绑定变量
  Typical 丌打印PROJECTION, ALIAS 组合使用的方式如下,注意每个关键词后面要加空格
  例如 ‘typical +peeked_binds’ => work ‘typical+peeked_binds’ => Error: format 'TYPICAL+peeked_binds' not valid for DBMS_XPLAN
  推荐格式:
  ALTER SESSION SET STATISTICS_LEVEL=ALL;
  select * from table(dbms_xplan.display_cursor(null,null,'ADVANCED ALLSTATS LAST PEEKED_BINDS'));
  父子游标
  使用脚本查询SQL_ID
  select sql_id,sql_text from v$SQL Where
  sql_text not like '%like%'
  and sql_text like '%$SQL%'; --$SQL处填入你的SQL的文本
  为了避免你的SQL和其他SQL混在一起,考虑增加一个注释 例如
  Select /* MACLEAN_TEST_PLAN_1 */ * from MAC;
  如果你之前执行过该诧句,那么为了引发该诧句的再次硬解析,对注释略作修改,例如上面的 PLAN_1 改为PLAN_2
  父游标所在
  Select * from v$SQLAREA where SQL_ID=%YOUR_SQL_ID%;
  子游标:执行计划和优化环境
  Select * from v$SQL where SQL_id=%YOUR_SQL_ID%;
  计划:
  Select * from v$SQL_PLAN where SQL_id=%YOUR_SQL_ID%;
  优化环境:
  Select * from v$SQL_OPTIMIZER_ENV where SQL_id=%YOUR_SQL_ID%;
  


页: [1]
查看完整版本: Oracle 执行计划