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