f Oracle Bind Variable ~ 迪貝之家

Pages

Oracle Bind Variable

我參加過去年由王蘭帶領中國大陸Oracle Support Team來台灣主持的一個技術研討會,會中毛彬建議要開啟cursor_sharing的參數,來降低Hard Parse,用以耗用較少資源的CPU運算及share pool的壓力。其實就我的實際經驗,真的是case by case 。
首先我提一下以前為一個政府單位進行三個月一次定檢他們資料庫的案例,當時我依據statspack 報表指出literal造成過多的hard parse 的敘述,把cursor_sharing 設成force,隔沒多久,就有使用者反應某些功能不能使用。仔細查看它出錯的sql 語句,原來他們的程式用了很多的子查詢,而且多層子查詢還不在少數,Oracle RDBMS 參數cursor_sharing=force會把右值轉成placeholder,但你想看看,如果右值是一個子查詢,一轉之下,系統進行parse還會成功嗎?更遑論進到執行階段了。當下只好把cursor_sharing調回exact 解決問題先。只要你維護過8及9的版本,又是一個對自己頗有期許的DBA,大概都會去買statspack performance tuning 這本書,書中就是提到了cursor_sharing 這個參數,書裡只提到了這個參數設下去,可能會有怪怪的現象發生,要先進行測試。理論人人會說,實際implement的時候,建議多思考一下,不然的話,也要跟你的客戶解釋清楚。當然有些site的資訊主管很強勢,會要求寫程式的同仁,這不能用,那也不准寫,但我想絕大多數的site,大概都沒這個power 。

再來就是在雙A之一工作的案例,PG來跟我反應,相同的一段sql 語句,在Toad右値直接帶字串執行速度很快,可是只要寫成Java程式,就是會變慢 。我第一件事當然是去比對兩者的執行計劃,確實不同,但要去固定Plan 又很麻煩,程式只要稍微動了一個字,定下來的Plan一樣是用不到,更何況還要去share pool裡頭慢慢比對sql id,及plan handle;PG又反應,那是一個很重要的業務,程式大概晚間十點跑,執行時段就是不能跨夜超過午夜12點。我也只能開Call詢問Oracle Support,依照往例,這種case能給個鬼建議方案阿!! 都嘛是要你改程式.....我也知道要改程式,但是要怎麼改,PG就是武到沒招式了,又承受了業務單位的壓力,只好來找我們DBA了。

當時我是參照metalink 文件401068.1,建議PG把Bind Variable 的執行方式,改成Literal帶入。PG改了程式之後 ,也確實執行效率大為改善。坦白說,在那個時候,我只知道bind variable跟literal的差異 ,但身為DBA的我 ,不會知道在java coding上的差異,最近因為我在研究Perl DBI 程式撰寫,提到了這個部份,我才深切的體會到,AP 在coding上的不同。

以硬體演進到現階段的狀況,真的沒必要去節省那一點點的CPU運算資源及記憶體的耗用,你的程式如果非常care 回應時間,那你程式就帶Literal吧!! 透過string Interporlate的方式,把要執行的sql statement,逐一全部帶出丟入資料庫去執行。底下是我節錄Oracle 文件的重點,有興趣的人可以看看

bind variable

bind variable

bind variable