Oracle--执行计划
一、什么是执行计划(explain plan)?
执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。?
二、如何查看执行计划?
1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。?
? ? ?很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面设置的。可以看到很多其它信息,如下所示?
? ? ?
?
2: 在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤?
SQL>EXPLAIN PLAN FOR SELECT * FROM SCOTT.EMP; --要解析的SQL脚本 SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
?
?3: 在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令:
SQL>SET TIMING ON --控制显示执行时间统计数据 SQL>SET AUTOTRACE ON EXPLAIN --这样设置包含执行计划、脚本数据输出,没有统计信息 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE OFF --不生成AUTOTRACE报告,这是缺省模式 SQL> SET AUTOTRACE ON --这样设置包含执行计划、统计信息、以及脚本数据输出 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE OFF SQL> SET AUTOTRACE TRACEONLY --这样设置会有执行计划、统计信息,不会有脚本数据输出 SQL>执行需要查看执行计划的SQL语句 SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息 SQL>执行需要查看执行计划的SQL语句
?
?
通过下面脚本查询到trace日志信息?
SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' || P.SPID || '.trc' TRACE_FILE_NAME FROM ( SELECT P.SPID FROM V$MYSTAT M, V$SESSION S, V$PROCESS P WHERE M.STATISTIC# =1 AND S.SID = M.SID AND P.ADDR = S.PADDR ) P, ( SELECT T.INSTANCE FROM V$THREAD T, V$PARAMETER V WHERE V.NAME ='thread' AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE)) ) I, (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T
?
?
三、看懂执行计划?
1.执行顺序?
执行顺序的原则是:由上至下,从右向左?
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行?
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。?
当然,你在PL/SQL工具中也可以通过它提供的功能来查看执行顺序。如下图所示:?
?2.执行计划中字段解释
?SQL>?
?
?
3.具体内容查看?
1> Plan hash Value?
这一行是这一条语句的的hash值,我们知道ORACLE对每一条ORACLE语句产生的执行计划放在SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。?
2> COST?
COST没有单位,是一个相对值,是SQL以CBO方式解析执行计划时,供ORACLE来评估CBO成本,选择执行计划用的。没有明确的含义,但是在对比是就非常有用。?
公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim?
3> 对上面执行计划列字段的解释:?
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)?
Operation:当前操作的内容。?
Name:操作对象?
Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。?
Bytes:表示执行该步骤后返回的字节数。?
Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。?
Time:Oracle 估计当前操作的时间。?
4.谓词说明:?
Predicate Information (identified by operation id):?
---------------------------------------------------?
2 - filter("B"."MGR" IS NOT NULL)?
4 - access("A"."EMPNO" = "B"."MGR")?
Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。?
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。?
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。?
5、 动态分析?
如果在执行计划中有如下提示:?
Note?
------------?
-dynamic sampling used for the statement?
这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。我们从而推断这个表可能没有做过分析。?
这里会出现两种情况:?
(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。?
(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。?
?