项目需要,要获取oracle的sql的对应的执行计划,之前mysql的版本已经实现过了。mysql的执行计划可以参考这个博客:
http://my.oschina.net/zimingforever/blog/60233
首先toad,PLsql这类工具本身就带有查看执行计划的功能,如何通过sql命令来实现呢
A设置autotrace,autotrace有以下几种取值
SET AUTOTRACE OFF 此为默认值,即关闭Autotrace SET AUTOTRACE ON EXPLAIN 只显示执行计划 SET AUTOTRACE ON STATISTICS 只显示执行的统计信息 SET AUTOTRACE ON 包含2,3两项内容 SET AUTOTRACE TRACEONLY 与ON相似,但不显示语句的执行结果由于本机没有试验环境,所以直接从网上摘了个demo,执行效果如下:
SQL> set autotrace on SQL> select * from dave; ID NAME ---------- ---------- 8 安庆 1 dave 2 bl 1 bl 2 dave 3 dba 4 sf-express 5 dmm 已选择8行。 执行计划 ---------------------------------------------------------- Plan hash value: 3458767806 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 8 | 64 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| DAVE | 8 | 64 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- 统计信息 ---------------------------------------------------------- 0 recursive calls 0 db block gets 4 consistent gets 0 physical reads 0 redo size 609 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 8 rows processedB 是使用explain的SQL来查看,语法是explain plan for sql
explain plan for select * from ZZ_TEST然后调用如下语句来显示结果
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
select * from table(dbms_xplan.display);显示结果如下:
Plan hash value: 1944298366 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | 40 | 15 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| ZZ_TEST | 5 | 40 | 15 (0)| 00:00:01 | -----------------------------------------------------------------------------
执行计划出来了,接下来我们要看懂每一个字段的含义了。
id是一个序号,但是并不表示执行的先后顺序,执行的先后顺序与缩进有关。
operation表示当前操作的内容。
row表示当前操作的的cardinality,是对当前操作返回结果集的一个估计值。
cost表示一个代价的值
time是估计的执行时间。
接下来是统计信息里的一些字段:
db block gets,表示从buffer cache中读取的block数量
consistent gets,表示从buffer cache中读取的undo数据的block数量。
physical reads,表示从磁盘上读取的block数量。
redo size,表示dml生成的redo的大小。
sorts(memory),表示在内存上执行的排序量。
sorts(disk),表示在硬盘上执行的排序量。
Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增 加相关的索引,优化SQL语句来解决。内容参考:
http://blog.csdn.net/tianlesoftware/article/details/5827245
不过我今天在程序里使用的一个历史版本的查看执行计划的方法。我没有封装,直接使用的原有的方法:
explain PLAN set statement_id= '1111' for select * from ZZ_TEST
SELECT ID, REPLACE ( LPAD (' ', 4 *(LEVEL - 1)), ' ', ' ' ) || operation || ' ' || options operation, optimizer, DECODE ( object_name, NULL, NULL, object_owner || '.' || object_name ) object_name, COST, CARDINALITY, other_tag, access_predicates, filter_predicates, bytes FROM plan_table A START WITH ID = 0 AND STATEMENT_ID = '1111' CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = '1111'
结果如下:
在执行问这个后需要手动执行下del操作
delete plan_table where statement_id=1111
这里有个参考文档:
http://www.iteye.com/topic/586256
总结一下:这里我们需要学会用sql语句来查看orale的执行计划和统计信息,知道执行计划和统计信息中各个字段的含义。