5.5如何產生執行計劃
要為一個語句生成執行計劃,可以有3種方法:
1).最簡單的辦法
Sql> set autotrace on
Sql> select * from dual;
執行完語句後,會顯示explain plan 與 統計信息。
這個語句的優點就是它的缺點,這樣在用該方法查看執行時間較長的sql語句時,需要等待該語句執行成功後,才返回執行計劃,使優化的周期大大增長。
如果想得到執行計劃,而不想看到語句產生的數據,可以采用:
Sql> set autotrace traceonly
這樣還是會執行語句。它比set autotrace on的優點是:不會顯示出查詢的數據,但是還是會將數據輸出到客戶端,這樣當語句查詢的數據比較多時,語句執行將會花費大量的時間,因為很大部分時間用在將數據從數據庫傳到客戶端上了。我一般不用這種方法。
Sql> set autotrace traceonly explain
如同用explain plan命令。對於select 語句,不會執行select語句,而只是產生執行計劃。但是對於dml語句,還是會執行語句,不同版本的數據庫可能會有小的差別。這樣在優化執行時間較長的select語句時,大大減少了優化時間,解決了“set autotrace on”與“set autotrace traceonly”命令優化時執行時間長的問題,但同時帶來的問題是:不會產生Statistics數據,而通過tatistics數據的物理I/O的次數,我們可以簡單的判斷語句執行效率的優劣。
如果執行該語句時遇到錯誤,解決方法為:
(1)在要分析的用戶下:
Sqlplus > @ ?\rdbms\admin\utlxplan.sql
(2) 用sys用戶登陸
Sqlplus > @ ?\sqlplus\admin\plustrce.sql
Sqlplus > grant plustrace to user_name; - - user_name是上面所說的分析用戶
2).用explain plan命令
(1) sqlplus > @ ?\rdbms\admin\utlxplan.sql
(2) sqlplus > explain plan set statement_id =’???’ for select ………………
注意,用此方法時,並不執行sql語句,所以只會列出執行計劃,不會列出統計信息,並且執行計劃只存在plan_table中。所以該語句比起set autotrace traceonly可用性要差。需要用下面的命令格式化輸出,所以這種方式我用的不多:
set linesize 150
set pagesize 500
col PLANLINE for a120
SELECT EXECORD EXEC_ORDER, PLANLINE
FROM (SELECT PLANLINE, ROWNUM EXECORD, ID, RID
FROM (SELECT PLANLINE, ID, RID, LEV
FROM (SELECT lpad('' '',2*(LEVEL),rpad('' '',80,'' ''))||
OPERATION||'' ''|| -- Operation
DECODE(OPTIONS,NULL,'''',