如何了解Oracle生成執(zhí)行計劃
Oracle還是比較常用的,于是我研究了一下Oracle生成執(zhí)行計劃,在這里拿出來和大家分享一下,希望對大家有用。如何Oracle生成執(zhí)行計劃?要為一個語句Oracle生成執(zhí)行計劃,可以有3種方法:
1.最簡單的辦法
執(zhí)行完語句后,會顯示explain plan 與 統(tǒng)計信息。這個語句的優(yōu)點就是它的缺點,這樣在用該方法查看執(zhí)行時間較長的sql語句時,需要等待該語句執(zhí)行成功后,才返回執(zhí)行計劃,使優(yōu)化的周期大大增長。
這樣,就只會列出執(zhí)行計劃,而不會真正的執(zhí)行語句,大大減少了優(yōu)化時間。雖然也列出了統(tǒng)計信息,但是因為沒有執(zhí)行語句,所以該統(tǒng)計信息沒有用處,如果執(zhí)行該語句時遇到錯誤,解決方法為:
(1)在要分析的用戶下
(2) 用sys用戶登陸
2.用explain plan命令
(1) sqlplus > @ ?\rdbms\admin\utlxplan.sql
(2) sqlplus > explain plan set statement_id =’???’ for select ………………
注意,用此方法時,并不執(zhí)行sql語句,所以只會列出執(zhí)行計劃,不會列出統(tǒng)計信息,并且執(zhí)行計劃只存在plan_table中。所以該語句比起set autotrace traceonly可用性要差。需要用下面的命令格式化輸出,所以這種方式我用的不多。
上面這2種方法只能為在本會話中正在運行的語句產(chǎn)生執(zhí)行計劃,即我們需要已經(jīng)知道了哪條語句運行的效率很差,我們是有目的只對這條SQL語句去優(yōu)化。其實,在很多情況下,我們只會聽一個客戶抱怨說現(xiàn)在系統(tǒng)運行很慢,而我們不知道是哪個SQL引起的。此時有許多現(xiàn)成的語句可以找出耗費資源比較多的語句。
從而對找出的語句進(jìn)行進(jìn)一步優(yōu)化。當(dāng)然我們還可以為一個正在運行的會話中運行的所有SQL語句生成執(zhí)行計劃,這需要對該會話進(jìn)行跟蹤,產(chǎn)生 trace文件,然后對該文件用tkprof程序格式化一下,這種得到執(zhí)行計劃的方式很有用,因為它包含其它額外信息,如SQL語句執(zhí)行的每個階段(如 Parse、Execute、Fetch)分別耗費的各個資源情況(如CPU、DISK、elapsed等)。
3.用dbms_system存儲過程Oracle生成執(zhí)行計劃
因為使用dbms_system存儲過程可以跟蹤另一個會話發(fā)出的sql語句,并記錄所使用的執(zhí)行計劃,而且還提供其它對性能調(diào)整有用的信息。因其使用方式與上面2種方式有些不太一樣,所以在附錄中單獨介紹。這種方法是對SQL進(jìn)行調(diào)整比較有用的方式之一,有些情況下非它不可。具體內(nèi)容參見附錄。
【編輯推薦】