怎么看懂oracle的执行计划

项目需要,要获取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 processed
B 是使用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的执行计划和统计信息,知道执行计划和统计信息中各个字段的含义。

转载于:https://my.oschina.net/zimingforever/blog/87215

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值