oracle 中,對(duì)于一個(gè)提交的sql語(yǔ)句,存在兩種可選的解析過(guò)程, 一種叫做硬解析,一種叫做軟解析.
之所以這樣是因?yàn)殚T閂是為了順序訪問(wèn)以及修改一些內(nèi)存區(qū)域而設(shè)置的,這些內(nèi)存區(qū)域是不能被同時(shí)修改。當(dāng)一個(gè)sql語(yǔ)句提交后,oracle會(huì)首先檢查一下共享緩沖池(shared pool)里有沒(méi)有與之完全相同的語(yǔ)句,如果有的話只須執(zhí)行軟分析即可,否則就得進(jìn)行硬分析。
綁定變量只是起到占位的作用,同名的綁定變量并不意味著在它們是同樣的,在傳遞時(shí)要考慮的是傳遞的值與綁定變量出現(xiàn)順序的對(duì)位,而不是綁定變量的名稱。
綁定變量是在通常情況下能提升效率,非正常的情況如下:
在字段(包括字段集)建有索引,且字段(集)的集的勢(shì)非常大(也就是有個(gè)值在字段中出現(xiàn)的比例特別的大)的情況下,使用綁定變量可能會(huì)導(dǎo)致查詢計(jì)劃錯(cuò)誤,因而會(huì)使查詢效率非常低。這種情況最好不要使用綁定變量。
但是并不是任何情況下都需要使用綁定變量,下面是兩種例外情況:
綁定變量不能當(dāng)作嵌入的字符串來(lái)使用,只能當(dāng)作語(yǔ)句中的變量來(lái)用。不能用綁定變量來(lái)代替表名、過(guò)程名、字段名等.
從效率來(lái)看,由于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 過(guò)程已成功完成。 已用時(shí)間: 00: 00: 00.03 SQL> select * from A; ID ---------- 3 5 已用時(shí)間: 00: 00: 00.06 SQL> insert into A values(:x); 已創(chuàng)建 1 行。 已用時(shí)間: 00: 00: 00.01 SQL> select * from A; ID ---------- 3 8 5 已用時(shí)間: 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 過(guò)程已成功完成。 已用時(shí)間: 00: 00: 00.12
這段代碼是不需要使用綁定變量的方法來(lái)提高效率的,ORACLE會(huì)自動(dòng)將其中的變量綁定。
SQL> create table D ( id varchar(10)); 表已創(chuàng)建。 已用時(shí)間: 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 過(guò)程已成功完成。 已用時(shí)間: 00: 00: 00.68 這段代碼同樣是執(zhí)行了1000條insert語(yǔ)句,但是每一條語(yǔ)句都是不同的,因此ORACLE會(huì)把每條語(yǔ)句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用綁定變量將循環(huán)中的語(yǔ)句改為
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 過(guò)程已成功完成。
已用時(shí)間: 00: 00: 00.18
這樣執(zhí)行的效率就高得多了。
在PL/SQL中,引用變量即是引用綁定變量。但是在pl/sql中動(dòng)態(tài)sql并不是這樣。
|
|
來(lái)自: guolijiegg > 《oracle》