基于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就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。
|