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