度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1547|回复: 2
打印 上一主题 下一主题

[分享] 如何分析oracle的执行计划(explain plan)

[复制链接]

348

主题

3572

帖子

9327

积分

论坛元老

Rank: 8Rank: 8

积分
9327
跳转到指定楼层
楼主
发表于 2020-7-22 22:10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql进行优化做相应说明。
一、什么是执行计划(explain plan)
执行计划:一条查询语句在oracle中的执行过程或访问路径的描述。
二、如何查看执行计划
1.set autotrace on
2.explain plan for sql语句;
select plan_table_output from table(dbms_xplan.display());
3.通过第3方工具,如plsql developer(f5查看执行计划)、toad等;
三、看懂执行计划
1.执行计划中字段解释
  1. SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;  

  2. 已选择13行。  

  3.    

  4. 执行计划  

  5. ----------------------------------------------------------  

  6. Plan hash value: 992080948  

  7. ---------------------------------------------------------------------------------------  

  8. | Id  | Operation                    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |  

  9. ---------------------------------------------------------------------------------------  

  10. |   0 | SELECT STATEMENT             |        |    13 |   988 |     6  (17)| 00:00:01 |  

  11. |   1 |  MERGE JOIN                  |        |    13 |   988 |     6  (17)| 00:00:01 |  

  12. |   2 |   TABLE ACCESS BY INDEX ROWID| EMP    |    14 |   532 |     2   (0)| 00:00:01 |  

  13. |   3 |    INDEX FULL SCAN           | PK_EMP |    14 |       |     1   (0)| 00:00:01 |  

  14. |*  4 |   SORT JOIN                  |        |    13 |   494 |     4  (25)| 00:00:01 |  

  15. |*  5 |    TABLE ACCESS FULL         | EMP    |    13 |   494 |     3   (0)| 00:00:01 |  

  16. ---------------------------------------------------------------------------------------  

  17.    

  18. Predicate Information (identified by operation id):  

  19. ---------------------------------------------------  

  20.    4 - access("A"."EMPNO"="B"."MGR")  

  21.        filter("A"."EMPNO"="B"."MGR")  

  22.    5 - filter("B"."MGR" IS NOT NULL)  

  23.    

  24. 统计信息  

  25. ----------------------------------------------------------  

  26.           0  recursive calls  

  27.           0  db block gets  

  28.          11  consistent gets  

  29.           0  physical reads  

  30.           0  redo size  

  31.        2091  bytes sent via SQL*Net to client  

  32.         416  bytes received via SQL*Net from client  

  33.           2  SQL*Net roundtrips to/from client  

  34.           1  sorts (memory)  

  35.           0  sorts (disk)  

  36.          13  rows processed  

  37. SQL>
复制代码
对上面执行计划列字段的解释:
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)
如:上面执行计划的执行顺序为:3--》2--》5--》4--》1
Operation: 当前操作的内容。
Name:操作对象
Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。
Bytes:表示执行该步骤后返回的字节数。
Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。
2.谓词说明:
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."EMPNO"="B"."MGR")
filter("A"."EMPNO"="B"."MGR")
5 - filter("B"."MGR" IS NOT NULL)

Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
四、 动态分析
如果在执行计划中有如下提示:
Note
------------
-dynamic sampling used for the statement

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析。
这里会出现两种情况:
(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。
(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
沙发
发表于 2020-7-23 17:04:14 | 只看该作者
很高级呀
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-7-23 17:04:55 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 09:42 , Processed in 0.179636 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表