檢視SQL執行計劃的方法(有待於進一步補充)

sembh發表於2010-07-13

首先需要明確檢視執行計劃的目的:(摘自官方文件)

It is important to generate and review execution plans for all of the key SQL statements in your application. Doing so lets you compare the optimizer execution plans of a SQL statement when the statement performed well to the plan when that the statement is not performing well. Having the comparison, along with information such as changes in data volumes, can assist in identifying the cause of performance degradation.

答:第一種方法:explain plan for…,生成指定sql語句的執行計劃,並把執行計劃儲存到使用者指定的表中,供使用者查詢,但不作為真正執行時的執行計劃,因為並沒有儲存在library cache中,得到的執行計劃也不是library cache中的,所以不是真正的執行計劃。

(1)SQL>explain plan for select * from emp

(2)SQL>select * from table(dbms_xplan.display);

第二種方法:SQL trace 10046事件。檢視trace檔案,跟蹤某個session的活動情況,跟蹤的結果包括生成SQL語句的執行計劃,可以用tkprof工具檢視跟蹤檔案。執行計劃有parse,bind,exec,fetch4個子過程,三個指標比較重要:disk(物理磁碟讀取次數)query(一致性讀),current(當前讀)3列,調整的目標也是降低這3個統計量。跟蹤會話資訊:

(1)exec dbms_support.start_trace_in_session(sid=>,serial=>,waits=>true,binds=>true),其中的sidserial可以從v$session中獲取。(2)v$process中獲取ospidoraclepid.然後SQL>oradebug setospid …; SQL>oradebug setorapid…;

第三種方法:從library cache中獲取,就是真正的執行計劃。其實就是綜合利用了v$sql_plan,v$sql_plan_statics(statics_level引數設為all),v$sql_workarea,v$sql_plan_statics_all這幾張檢視。可以對以上幾張檢視寫查詢,來獲得特定sql語句真正的執行計劃,也可以按照下面的步驟得到真正的執行計劃。

(1) select /*+zhangxm*/ count(*) from table….

(2) Select sql_id from v$sql where sql_text like ‘% zhangxm %’; --得到這個語句的sql_id

(3) Select * from table(dbms_xplan.display_cursor(‘sql_id’,null,’basic’)); --basic方式查

(4) Select * from table(dbms_xplan.display_cursor(‘sql_id’,null,’typical’));--typical方式

(5) Select * from table(dbms_xplan.display_cursor(‘sql_id’,null,’all)); --all方式檢視

看其中的一些列,比如isstats,memstats,allstats:實際花費。A_time:語句執行時真正的花費。

還有一種:select * from table(dbms_xplan.display_awr(‘sql_id’));--呼叫display_awr,傳入sql_id引數。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24214296/viewspace-1035226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章