基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明。
这个执行计划是怎么得到的?既然是计划,那么绝对不是把这个语句先执行一遍,然后把这个计算出来,那样的话这个执行计划就成了事后诸葛亮了。 这个执行计划是oracle根据统计信息得到的。执行计划的准确性(主要指数据返回,数据量大小)由统计信息的准确性决定。
执行计划是一条查询语句在ORACLE中的执行过程或访问路径的描述。
查看执行计划语句:
EXPLAIN PLAN FOR SELECT * FROM SCOTT.EMP; --要解析的SQL脚本
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); --查看执行计划
看懂执行计划:
执行顺序的原则是: 由上至下,从右向左(Operator缩进位置)。
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行。
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。
根据执行顺序我们知道执行顺序是id为 4 2 3 1 0 的顺序执行的。
具体内容查看:
1.Plan hash Value:
这一行是这一条语句的的hash值,我们知道ORACLE对每一条SQL语句产生的执行计划放在 SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。
2.对上面执行计划列字段的解释:
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)
Operation:当前操作的内容。
Name:操作对象
Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。
Bytes:表示执行该步骤后返回的字节数。
Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。
3.谓词说明:
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"."MGR" IS NOT NULL)
4 - access("A"."EMPNO" = "B"."MGR")
Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
关于Autotrace几个常用选项的说明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出
这个执行计划是怎么得到的?既然是计划,那么绝对不是把这个语句先执行一遍,然后把这个计算出来,那样的话这个执行计划就成了事后诸葛亮了。 这个执行计划是oracle根据统计信息得到的。执行计划的准确性(主要指数据返回,数据量大小)由统计信息的准确性决定。
ANALYZE TABLE TEST COMPUTE STATISTICS;--查看表的统计信息
执行计划是一条查询语句在ORACLE中的执行过程或访问路径的描述。
查看执行计划语句:
EXPLAIN PLAN FOR SELECT * FROM SCOTT.EMP; --要解析的SQL脚本
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); --查看执行计划
![](https://i-blog.csdnimg.cn/blog_migrate/d2b3fe3570a8f3367550cc5bf328a429.jpeg)
看懂执行计划:
执行顺序的原则是: 由上至下,从右向左(Operator缩进位置)。
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行。
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。
![](https://i-blog.csdnimg.cn/blog_migrate/8b44c64ac0d53fa1606657dc07927a2c.jpeg)
根据执行顺序我们知道执行顺序是id为 4 2 3 1 0 的顺序执行的。
具体内容查看:
1.Plan hash Value:
这一行是这一条语句的的hash值,我们知道ORACLE对每一条SQL语句产生的执行计划放在 SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。
2.对上面执行计划列字段的解释:
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)
Operation:当前操作的内容。
Name:操作对象
Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。
Bytes:表示执行该步骤后返回的字节数。
Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。
3.谓词说明:
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"."MGR" IS NOT NULL)
4 - access("A"."EMPNO" = "B"."MGR")
Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
关于Autotrace几个常用选项的说明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出