oracle的sql的对应的执行计划应该如何看懂

项目须要,要获取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类似,但不显示语句的执行结果
因为本机没有试验环境,因此直接从网上摘了个demo,执行效果以下:
01 SQL> setautotrace 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 hashvalue: 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
B 是使用explain的SQL来查看,语法是explain plan for sql
1 explain plan for select fromZZ_TEST
而后调用以下语句来显示结果
1 SELECT plan_table_output FROMTABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
1 select fromtable(dbms_xplan.display);
显示结果以下:
1 Plan hashvalue: 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 fromZZ_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 WITHID = 0
23 AND STATEMENT_ID = '1111' CONNECT BY PRIORID = parent_id
24 ANDSTATEMENT_ID = '1111'

结果以下:

在执行问这个后须要手动执行下del操做


1 delete plan_table wherestatement_id=1111

这里有个参考文档:

http://www.iteye.com/topic/586256

总结一下:这里咱们须要学会用sql语句来查看orale的执行计划和统计信息,知道执行计划和统计信息中各个字段的含义。北京IT培训 www.idting.com/ITpeixun/

相关文章
相关标签/搜索