資源描述:
《綁定變量用法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、在開(kāi)發(fā)一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)前,有誰(shuí)對(duì)Oracle系統(tǒng)了解很多,尤其是它的特性,好象很少吧;對(duì)初學(xué)者來(lái)講,這更是不可能的事情;僅僅簡(jiǎn)單掌握了SQL的寫法,就開(kāi)始了數(shù)據(jù)庫(kù)的開(kāi)發(fā),其結(jié)果只能是開(kāi)發(fā)一個(gè)沒(méi)有效率,也沒(méi)有可擴(kuò)展的系統(tǒng); 因此,我寫這個(gè)主題也是希望讓大家更多地掌握Oracle數(shù)據(jù)庫(kù)的特性,從而在架構(gòu)一個(gè)新系統(tǒng)時(shí),能考慮系統(tǒng)的可擴(kuò)展,可伸縮性,也兼顧系統(tǒng)的效率和穩(wěn)定; 使用綁定變量是Oracle數(shù)據(jù)庫(kù)的特性之一;于是大家要問(wèn),為什么使用,怎樣使用,它的使用限制條件是什么?我會(huì)按照這樣的想法去解答大家的疑問(wèn),我也會(huì)以舉例子的方式來(lái)回答這
2、些問(wèn)題; 1.為什么使用綁定變量? 這是解決Oracle應(yīng)用程序可伸縮性的一個(gè)關(guān)鍵環(huán)節(jié);而Oracle的共享池就決定了開(kāi)發(fā)人員必須使用綁定變量;如果想要Oracle運(yùn)行減慢,甚至完全終止,那就可以不用綁定變量; 這里舉例說(shuō)明上述問(wèn)題; 為了查詢一個(gè)員工代號(hào)是123,你可以這樣查詢: select*fromempwhereempno=’123’; 你也可以這樣查詢: select*fromempwhereempno=:empno; 象我們往常一樣,你查詢員工’123’一次以后,有可能再也不用;接著你有可能查詢員工’456
3、’,然后查詢’789’等等;如果查詢使用象第一個(gè)查詢語(yǔ)句,你每次查詢都是一個(gè)新的查詢(我們叫它硬編碼的查詢方法);因此,Oracle每次必須分析,解析,安全檢查,優(yōu)化等等; 第二個(gè)查詢語(yǔ)句提供了綁定變量:empno,它的值在查詢執(zhí)行時(shí)提供,查詢經(jīng)過(guò)一次編譯后,查詢方案存儲(chǔ)在共享池中,可以用來(lái)檢索和重用;在性能和伸縮性方面,這兩者的差異是巨大的,甚至是驚人的;通俗點(diǎn)講,就不是一個(gè)級(jí)別; 第一個(gè)查詢使用的頻率越高,所消耗的系統(tǒng)硬件資源越大,從而降低了用戶的使用數(shù)量;它也會(huì)把優(yōu)化好的其它查詢語(yǔ)句從共享池中踢出;就象一個(gè)老鼠壞了一鍋湯似的
4、,系統(tǒng)的整體性能降低;而執(zhí)行綁定變量,提交相同對(duì)象的完全相同的查詢的用戶(這句話,大家聽(tīng)起來(lái)比較難理解,隨后我會(huì)給出詳細(xì)的解釋),一次性使用就可重復(fù)使用,其效率不言耳語(yǔ);打個(gè)形象的比喻來(lái)說(shuō),第一個(gè)查詢就象一次性使用的筷子,而第二個(gè)查詢象是鐵筷子,只要洗干凈,張三李四都能用,合理有效地使用了資源; 下面舉例子去詳細(xì)論證上述的問(wèn)題,不使用綁定變量為生病狀況: 這是一個(gè)未使用的綁定變量(吃藥前): setechoon;(把執(zhí)行結(jié)果顯示出來(lái)) altersystemflushshared_pool; 這條語(yǔ)句是清空共項(xiàng)池,每次都必須
5、使用,確保共享池是空的,以提高執(zhí)行效率;以下是引用片段: set?timing?on(打開(kāi)記時(shí)器.) declare type?rc?is?ref?cursor; l_rc?rc; l_dummy?all_objects.object_name%type; l_start?number?default?dbms_utility.get_time; begin for?i?in?1?..?1000 loop open?l_rc?for 'select?object_name from?all_objects w
6、here?object_id?=?'?
7、
8、?i; fetch?l_rc?into?l_dummy; close?l_rc; end?loop; dbms_output.put_line (?round(?(dbms_utility.get_time-l_start)/100,?2?)?
9、
10、 '?seconds...'?); end; / PL/SQL?過(guò)程已成功完成。 執(zhí)行時(shí)間:?已用時(shí)間:?00:?00:?07.03 這是一個(gè)使用的綁定變量(吃藥后): set?echo?on alter?system?fl
11、ush?shared_pool; declare type?rc?is?ref?cursor; l_rc?rc; l_dummy?all_objects.object_name%type; l_start?number?default?dbms_utility.get_time; begin for?i?in?1?..?1000 loop open?l_rc?for 'select?object_name from?all_objects where?object_id?=?:x' using?i; fet
12、ch?l_rc?into?l_dummy; close?l_rc; end?loop; dbms_output.put_line (?round(?(dbms_utility.get_time-l_start)/