查看执行计划的方法:
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 -------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------------- | 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 id): --------------------------------------------------- 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%;