SQL語句編寫時,一般都是這樣的:
select * from emp where empno=7369;
或者select * from emp where empno=7499;
這兩條SQL語句對于Oracle來說是兩條不同的SQL語句,換句話說是執(zhí)行兩條語句時,都會經(jīng)歷:1、語法語義檢查;2、硬解析;3、形成執(zhí)行計劃;4、返回相應(yīng)數(shù)據(jù)
大致的步驟是這樣的,其中硬解析是非常消耗資源的,比如CPU,內(nèi)存,其中SGA中的latch的爭用是我需要重點提到的,因為這是一種串行結(jié)構(gòu)。
綁定變量只需要解析一次SQL語句的文本即可,換句話說,前面兩句語句可以寫成一條,讓Oracle重復(fù)使用已經(jīng)解析好的信息,比如解析樹,執(zhí)行計劃等,話句話說執(zhí)行:
select * from emp where empno=7499;時無需執(zhí)行硬解析,減少了latch的爭用。
詳細硬解析和軟解析,軟軟解析等以后再詳細介紹。
今天主要介紹下,綁定變量與沒有綁定變量的性能?
下面創(chuàng)建兩個過程PRoc1,proc2:
create or replace procedure proc1 asbeginfor i in 1 .. 10000 loopexecute immediate 'insert into t values('||i||')';end loop;end;
create or replace procedure proc2 asbeginfor i in 1 .. 10000 loopexecute immediate 'insert into t values(:x)' using i;end loop;end;
執(zhí)行proc1:
執(zhí)行proc2:
很明顯綁定變量與沒有綁定變量的性能差別是非常大的,這也是需要在開發(fā)應(yīng)用程序中使用綁定變量的很重要的性能目的。
文章的參考:《Oracle編程藝術(shù)深入理解數(shù)據(jù)庫體系結(jié)構(gòu)》
新聞熱點
疑難解答