度量快速开发平台-专业、快速的软件定制快开平台
标题: 如何分析oracle的执行计划(explain plan) [打印本页]
作者: 万望 时间: 2020-7-22 22:10
标题: 如何分析oracle的执行计划(explain plan)
基于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.执行计划中字段解释
- SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;
-
- 已选择13行。
-
-
-
- 执行计划
-
- ----------------------------------------------------------
-
- Plan hash value: 992080948
-
- ---------------------------------------------------------------------------------------
-
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
- ---------------------------------------------------------------------------------------
-
- | 0 | SELECT STATEMENT | | 13 | 988 | 6 (17)| 00:00:01 |
-
- | 1 | MERGE JOIN | | 13 | 988 | 6 (17)| 00:00:01 |
-
- | 2 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 532 | 2 (0)| 00:00:01 |
-
- | 3 | INDEX FULL SCAN | PK_EMP | 14 | | 1 (0)| 00:00:01 |
-
- |* 4 | SORT JOIN | | 13 | 494 | 4 (25)| 00:00:01 |
-
- |* 5 | TABLE ACCESS FULL | EMP | 13 | 494 | 3 (0)| 00:00:01 |
-
- ---------------------------------------------------------------------------------------
-
-
-
- Predicate Information (identified by operation id):
-
- ---------------------------------------------------
-
- 4 - access("A"."EMPNO"="B"."MGR")
-
- filter("A"."EMPNO"="B"."MGR")
-
- 5 - filter("B"."MGR" IS NOT NULL)
-
-
-
- 统计信息
-
- ----------------------------------------------------------
-
- 0 recursive calls
-
- 0 db block gets
-
- 11 consistent gets
-
- 0 physical reads
-
- 0 redo size
-
- 2091 bytes sent via SQL*Net to client
-
- 416 bytes received via SQL*Net from client
-
- 2 SQL*Net roundtrips to/from client
-
- 1 sorts (memory)
-
- 0 sorts (disk)
-
- 13 rows processed
-
- 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就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。
作者: 陈晓龙 时间: 2020-7-23 17:04
很高级呀
作者: 陈晓龙 时间: 2020-7-23 17:04
欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) |
Powered by Discuz! X3.2 |