执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。
如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 看懂执行计划也就成了SQL优化的先决条件。 通过执行计划定位性能问题,定位后就通过建立索引、修改sql等解决问题。
一、执行计划的查看
1.1 设置autotrace
autotrace命令如下
序号
命令
解释
1
SET AUTOTRACE OFF
此为默认值,即关闭Autotrace
2
SET AUTOTRACE ON EXPLAIN
只显示执行计划
3
SET AUTOTRACE ON STATISTICS
只显示执行的统计信息
4
SET AUTOTRACE ON
包含2,3两项内容
5
SET AUTOTRACE TRACEONLY
与ON相似,但不显示语句的执行结果
1.2 使用SQL
在执行的sql前面加上EXPLAIN PLAN FOR
SQL> EXPLAIN PLAN FOR SELECT * FROMEMP;
已解释。
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
或者:
SQL> select * from table(dbms_xplan.display);
1.3 使用PL/SQL Developer,Navicat, Toad等客户端工具
二、如何读懂执行计划
2.1执行顺序的原则
执行顺序的原则是:由上至下,从右向左
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。
一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。
以下面的sql为例(sakila样例数据库中的address city country连接查询)
selectaddress.address, city.city, country.countryfromaddressinner join city on address.city_id =city.city_idinner join country on city.country_id = country.country_id;
2.2 执行计划中字段解释
ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。
Operation: 当前操作的内容。
Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。
Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。
在看执行计划的时候,除了看执行计划本身,还需要看谓词和统计信息。 通过整体信息来判断SQL效率。
2.3 谓词说明
Access :
通过某种方式定位了需要的数据,然后读取出这些结果集,叫做Access。
表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。
Filter:
把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做filter 。
表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
2.4 Statistics(统计信息)说明
recursive calls
产生的递归sql调用的条数。
Db block gets:
从buffer cache中读取的block的数量
consistent gets
从buffer cache中读取的undo数据的block的数量
physical reads
从磁盘读取的block的数量
redo size