博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怎么看懂oracle的执行计划
阅读量:6151 次
发布时间:2019-06-21

本文共 3433 字,大约阅读时间需要 11 分钟。

hot3.png

项目需要,要获取oracle的sql的对应的执行计划,之前mysql的版本已经实现过了。mysql的执行计划可以参考这个博客:

首先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 onSQL> 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语句来解决。
内容参考:

不过我今天在程序里使用的一个历史版本的查看执行计划的方法。我没有封装,直接使用的原有的方法:

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,	bytesFROM	plan_table A START WITH ID = 0 AND STATEMENT_ID = '1111' CONNECT BY PRIOR ID = parent_idAND STATEMENT_ID = '1111'

结果如下:

在执行问这个后需要手动执行下del操作

delete plan_table where statement_id=1111

这里有个参考文档:

总结一下:这里我们需要学会用sql语句来查看orale的执行计划和统计信息,知道执行计划和统计信息中各个字段的含义。

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

你可能感兴趣的文章
HTML.2文本
查看>>
Ubuntu unity安装Indicator-Multiload
查看>>
解决Eclipse中新建jsp文件ISO8859-1 编码问题
查看>>
7.对象创建型模式-总结
查看>>
1、块:ion-item
查看>>
【论文阅读】Classification of breast cancer histology images using transfer learning
查看>>
移动端处理图片懒加载
查看>>
jQuery.on() 函数详解
查看>>
谈缓存和Redis
查看>>
【转】百度地图api,根据多点注标坐标范围计算地图缩放级别zoom自适应地图
查看>>
用户调研(补)
查看>>
ExtJS之开篇:我来了
查看>>
☆1018
查看>>
oracle 去掉空格
查看>>
6.13心得
查看>>
Runtime类
查看>>
eclipse decompiler
查看>>
记一个搜索网盘资源的网站
查看>>
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>