【转】Oracle 执行计划(Explain Plan) 说明

时间:2021-12-20 03:49:22

转自:http://blog.chinaunix.net/uid-21187846-id-3022916.html

      如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。看懂执行计划也就成了SQL优化的先决条件。这里的SQL优化指的是SQL性能问题的定位,定位后就可以解决问题。

查看执行计划的三种方法

  • 设置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相似,但不显示语句的执行结果

  • 使用SQL
EXPLAIN PLAN FOR sql语句;
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
或者select
* from table(dbms_xplan.display);
  • 使用Toad,PL/SQL Developer工具

Cardinality(基数)/ rows

Cardinality值表示CBO预期从一个行源(row source)返回的记录数,这个行源可能是一个表,一个索引,也可能是一个子查询。 在Oracle 9i中的执行计划中,Cardinality缩写成Card。 在10g中,Card值被rows替换。

Cardinality的值对于CBO做出正确的执行计划来说至关重要。 如果CBO获得的Cardinality值不够准确(通常是没有做分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致CBO错误的制定出执行计划。

对于多表查询,CBO使用每个关联表返回的行数(Cardinality)决定用什么样的访问方式来做表关联(如Nested loops Join 或 hash Join)。

多表连接的三种方式详解 HASH JOIN /MERGE JOIN/ NESTED LOOP

http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5826546.aspx

SQL 的执行计划

Oracle SQL的硬解析和软解析

http://blog.csdn.net/tianlesoftware/archive/2010/04/08/5458896.aspx

示例:

SQL> SET AUTOTRACE TRACEONLY; -- 只显示执行计划,不显示结果集

SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;

【转】Oracle 执行计划(Explain Plan) 说明

在Toad 里面,很清楚的显示了执行的顺序。 但是如果在SQLPLUS里面就不是那么直接。 但我们也可以判断:一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的

字段解释:

  1. ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。
  2. Operation: 当前操作的内容。
  3. Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。
  4. Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。