ORACLE中查看执行计划plan

时间:2022-01-30 03:50:02

ORACLE中查看执行计划plan

必须声明,以下是基于oracle10g的,对8i及其更早的版本不再讨论。
一:执行形式
通常我们在sql*plus中就可以执行了。在形式上,如果按照输出结果方式主要有两个不同,按照执行方式也有两个不同。
至于如何使用dbms_xplan包裹,不在此详述,我自己一般也不用。
1)执行方式1 -- set autotrace traceonly..
sql>set serveroutput on
sql>set autotrace traceonly
完整格式是:
SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
然后运行即可直接的查看结果,如例子(已经手工删除一些空白):
SQL> select * from tab;
已选择442行。
执行计划
----------------------------------------------------------
Plan hash value: 457676135
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1066 | 90610 | 204 (4)| 00:00:03 |
| 1 | NESTED LOOPS OUTER | | 1066 | 90610 | 204 (4)| 00:00:03 |
|* 2 | TABLE ACCESS FULL | OBJ$ | 1066 | 83148 | 152 (5)| 00:00:02 |
| 3 | TABLE ACCESS CLUSTER| TAB$ | 1 | 7 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 0 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("O"."TYPE#"<=5 AND "O"."OWNER#"=USERENV('SCHEMAID') AND
"O"."TYPE#">=2 AND "O"."LINKNAME" IS NULL)
4 - access("O"."OBJ#"="T"."OBJ#"(+))
统计信息
----------------------------------------------------------
8 recursive calls
0 db block gets
1684 consistent gets
0 physical reads
0 redo size
11810 bytes sent via SQL*Net to client
704 bytes received via SQL*Net from client
31 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
442 rows processed
(注:墨绿色部分是EXPLAIN PLAN输出所不具有的)
该命令参考见<<sql * plus user's guide and reference release 10.2>> B14357-01.
如果想不起来,可以用sql> help set来查看可用SET命令。
2)EXPLAIN PLAIN FOR
直接执行EXPLAIN PLAN FOR SELECT * FROM TAB;
SQL> set autotrace off;
SQL> explain plan for select * from tab;
已解释。
SQL> select * from table(dbms_xplan.display);
具体结果略。
该命令必须参考<<Oracle Database SQL Reference 10g Release 2 (10.2) >>B14200-02
其它的可以参考视图:V$SQL_WORKAREA,V$SQL_PLAN,V$SQL_PLAN_STATISTICS,V$SQL_PLAN_STATISTICS_ALL。
可以参考的其它书籍是: Oracle Database Performance Tuning Guide (有关explain输出),Oracle Database Reference(前面提到的动态性能视图,那几个v$开头的).
 3)两种方式的比较
a) 前面一种方式更加简单,而且只有一次设置,次次有效(SQL*PLUS环境下),输出的结果也更详细,缺点
是输出结果必须用spool才可以保存。
b)后面一种方式稍微麻烦一些,需要为每个独立的SQL执行,但优点是输出的结果可以存储到表格中,因为
dbms_xplan.display是一个管道表函数,输出的每一行都是varchar2类型。
综合而言,我还是更喜欢用set的方式。
它们的共同点在于,都需要用到表格plan_table ,有关plan_Table的脚本执行脚本ORACLE_HOME\RDBMS\ADMIN\UTLXPLAN.SQL
二:可用的参考书籍
1)sql * plus user's guide and reference release 10.2
2)Oracle Database SQL Reference 10g Release 2 (10.2)
3)Oracle Database Performance Tuning Guide
4)Oracle Database Reference