SQL語句編寫時,一般都是這樣的:
select * from emp where empno=7369;
或者select * from emp where empno=7499;
這兩條SQL語句對于Oracle來說是兩條不同的SQL語句,換句話說是執行兩條語句時,都會經曆:1、文法語義檢查;2、硬解析;3、形成執行計劃;4、傳回相應資料
大緻的步驟是這樣的,其中硬解析是非常消耗資源的,比如CPU,記憶體,其中SGA中的latch的争用是我需要重點提到的,因為這是一種串行結構。
綁定變量隻需要解析一次SQL語句的文本即可,換句話說,前面兩句語句可以寫成一條,讓Oracle重複使用已經解析好的資訊,比如解析樹,執行計劃等,話句話說執行:
select * from emp where empno=7499;時無需執行硬解析,減少了latch的争用。
詳細硬解析和軟解析,軟軟解析等以後再詳細介紹。
今天主要介紹下,綁定變量與沒有綁定變量的性能?
下面建立兩個過程proc1,proc2:
create or replace procedure proc1 as
begin
for i in 1 .. 10000 loop
execute immediate 'insert into t values('||i||')';
end loop;
end;
create or replace procedure proc2 as
begin
for i in 1 .. 10000 loop
execute immediate 'insert into t values(:x)' using i;
end loop;
end;
執行proc1:
執行proc2:
很明顯綁定變量與沒有綁定變量的性能差别是非常大的,這也是需要在開發應用程式中使用綁定變量的很重要的性能目的。
文章的參考:《Oracle程式設計藝術深入了解資料庫體系結構》