您的位置:首页 > 数据库 > Oracle

ORACLE中查看执行计划plan

2008-09-02 17:15 555 查看
必须声明,以下是基于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: