项目须要,要获取oracle的sql的对应的执行计划,以前mysql的版本已经实现过了。mysql的执行计划能够参考这个博客: mysql
http://my.oschina.net/zimingforever/blog/60233 sql
首先toad,PLsql这类工具自己就带有查看执行计划的功能,如何经过sql命令来实现呢 数据库
A设置autotrace,autotrace有如下几种取值 express
1 |
SET AUTOTRACE OFF 此为默认值,即关闭Autotrace |
2 |
SET AUTOTRACE ON EXPLAIN 只显示执行计划 |
3 |
SET AUTOTRACE ON STATISTICS 只显示执行的统计信息 |
4 |
SET AUTOTRACE ON 包含2,3两项内容 |
5 |
SET AUTOTRACE TRACEONLY 与ON类似,但不显示语句的执行结果 |
01 |
SQL> set autotrace on |
02 |
SQL> select * from dave; |
03 |
ID NAME |
04 |
---------- ---------- |
05 |
8 安庆 |
06 |
1 dave |
07 |
2 bl |
08 |
1 bl |
09 |
2 dave |
10 |
3 dba |
11 |
4 sf-express |
12 |
5 dmm |
13 |
|
14 |
已选择8行。 |
15 |
|
16 |
执行计划 |
17 |
---------------------------------------------------------- |
18 |
Plan hash value: 3458767806 |
19 |
-------------------------------------------------------------------------- |
20 |
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | |
21 |
-------------------------------------------------------------------------- |
22 |
| 0 | SELECT STATEMENT | | 8 | 64 | 2 (0)| 00:00:01 | |
23 |
| 1 | TABLE ACCESS FULL| DAVE | 8 | 64 | 2 (0)| 00:00:01 | |
24 |
-------------------------------------------------------------------------- |
25 |
|
26 |
统计信息 |
27 |
---------------------------------------------------------- |
28 |
0 recursive calls |
29 |
0 db block gets |
30 |
4 consistent gets |
31 |
0 physical reads |
32 |
0 redo size |
33 |
609 bytes sent via SQL*Net to client |
34 |
416 bytes received via SQL*Net from client |
35 |
2 SQL*Net roundtrips to/from client |
36 |
0 sorts (memory) |
37 |
0 sorts (disk) |
38 |
8 rows processed |
1 |
explain plan for select * from ZZ_TEST |
1 |
SELECT plan_table_output FROM TABLE (DBMS_XPLAN.DISPLAY( 'PLAN_TABLE' )); |
1 |
select * from table (dbms_xplan.display); |
1 |
Plan hash value: 1944298366 |
2 |
|
3 |
----------------------------------------------------------------------------- |
4 |
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | |
5 |
----------------------------------------------------------------------------- |
6 |
| 0 | SELECT STATEMENT | | 5 | 40 | 15 (0)| 00:00:01 | |
7 |
| 1 | TABLE ACCESS FULL| ZZ_TEST | 5 | 40 | 15 (0)| 00:00:01 | |
8 |
----------------------------------------------------------------------------- |
执行计划出来了,接下来咱们要看懂每个字段的含义了。 oracle
id是一个序号,可是并不表示执行的前后顺序,执行的前后顺序与缩进有关。 工具
operation表示当前操做的内容。 性能
row表示当前操做的的cardinality,是对当前操做返回结果集的一个估计值。 优化
cost表示一个代价的值 spa
time是估计的执行时间。 .net
接下来是统计信息里的一些字段:
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
不过我今天在程序里使用的一个历史版本的查看执行计划的方法。我没有封装,直接使用的原有的方法:
1 |
explain PLAN set statement_id= '1111' for select * from ZZ_TEST |
01 |
SELECT |
02 |
ID, |
03 |
REPLACE ( |
04 |
LPAD ( ' ' , 4 *( LEVEL - 1)), |
05 |
' ' , |
06 |
' ' |
07 |
) || operation || ' ' || options operation, |
08 |
optimizer, |
09 |
DECODE ( |
10 |
object_name, |
11 |
NULL , |
12 |
NULL , |
13 |
object_owner || '.' || object_name |
14 |
) object_name, |
15 |
COST, |
16 |
CARDINALITY, |
17 |
other_tag, |
18 |
access_predicates, |
19 |
filter_predicates, |
20 |
bytes |
21 |
FROM |
22 |
plan_table A START WITH ID = 0 |
23 |
AND STATEMENT_ID = '1111' CONNECT BY PRIOR ID = parent_id |
24 |
AND STATEMENT_ID = '1111' |
结果以下:
在执行问这个后须要手动执行下del操做
1 |
delete plan_table where statement_id=1111 |
这里有个参考文档:
http://www.iteye.com/topic/586256
总结一下:这里咱们须要学会用sql语句来查看orale的执行计划和统计信息,知道执行计划和统计信息中各个字段的含义。北京IT培训 www.idting.com/ITpeixun/