| oracle 中,對于一個提交的sql語句,存在兩種可選的解析過程, 一種叫做硬解析,一種叫做軟解析. 
 之所以這樣是因?yàn)殚T閂是為了順序訪問以及修改一些內(nèi)存區(qū)域而設(shè)置的,這些內(nèi)存區(qū)域是不能被同時修改。當(dāng)一個sql語句提交后,oracle會首先檢查一下共享緩沖池(shared pool)里有沒有與之完全相同的語句,如果有的話只須執(zhí)行軟分析即可,否則就得進(jìn)行硬分析。 
 綁定變量只是起到占位的作用,同名的綁定變量并不意味著在它們是同樣的,在傳遞時要考慮的是傳遞的值與綁定變量出現(xiàn)順序的對位,而不是綁定變量的名稱。 
 綁定變量是在通常情況下能提升效率,非正常的情況如下: 
 在字段(包括字段集)建有索引,且字段(集)的集的勢非常大(也就是有個值在字段中出現(xiàn)的比例特別的大)的情況下,使用綁定變量可能會導(dǎo)致查詢計(jì)劃錯誤,因而會使查詢效率非常低。這種情況最好不要使用綁定變量。 
 但是并不是任何情況下都需要使用綁定變量,下面是兩種例外情況: 
 
 綁定變量不能當(dāng)作嵌入的字符串來使用,只能當(dāng)作語句中的變量來用。不能用綁定變量來代替表名、過程名、字段名等. 
 從效率來看,由于oracle10G放棄了RBO,全面引入CBO,因此,在10G中使用綁定變量效率的提升比9i中更為明顯。 
 舉例: 
 SELECT fname, lname, pcode FROM cust WHERE id = 674; 
 Sql*plus 中使用綁定變量: 
 SQL> variable x number; SQL> exec :x :=8 PL/SQL 過程已成功完成。 已用時間: 00: 00: 00.03 SQL> select * from A; ID ---------- 3 5 已用時間: 00: 00: 00.06 SQL> insert into A values(:x); 已創(chuàng)建 1 行。 已用時間: 00: 00: 00.01 SQL> select * from A; ID ---------- 3 8 5 已用時間: 00: 00: 00.01 
 SQL> declare 2 I NUMBER; 3 BEGIN 4 FOR I IN 1..1000 LOOP 5 INSERT INTO A VALUES(I); 6 end loop; 7 end; 8 / PL/SQL 過程已成功完成。 已用時間: 00: 00: 00.12 
 這段代碼是不需要使用綁定變量的方法來提高效率的,ORACLE會自動將其中的變量綁定。 
 SQL> create table D ( id varchar(10)); 表已創(chuàng)建。 已用時間: 00: 00: 00.50 SQL> declare 2 i number; 3 sqlstr varchar(2000); 4 begin 5 for i in 1..1000 loop 6 sqlstr :=' insert into d values('||to_char(i)||')'; 7 execute immediate sqlstr; 8 end loop; 9 end; 10 / PL/SQL 過程已成功完成。 已用時間:  00: 00: 00.68 這段代碼同樣是執(zhí)行了1000條insert語句,但是每一條語句都是不同的,因此ORACLE會把每條語句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用綁定變量將循環(huán)中的語句改為 
 SQL> declare 2 i number; 3 sqlstr varchar(2000); 4 begin 5 for i in 1..1000 loop 6 sqlstr :=' insert into d values(:i)'; 7 execute immediate sqlstr using i; 8 end loop; 9 end; 10 / PL/SQL 過程已成功完成。 
 已用時間: 00: 00: 00.18 
 這樣執(zhí)行的效率就高得多了。 
 
 在PL/SQL中,引用變量即是引用綁定變量。但是在pl/sql中動態(tài)sql并不是這樣。 
 | 
|  |