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