動態(tài)SQL和靜態(tài)SQL及綁定變量性能對比
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了鞍山免費建站歡迎大家使用!
1、測試樣例
下面的三個存儲過程,分別使用了動態(tài)SQL、綁定變量、靜態(tài)SQL三種編程方式。具體存儲過程內(nèi)容如下:
l)動態(tài)SQL
create or replace procedure proc1 as begin for i in 1 .. 100000 loop execute immediate 'insert into t values (' || i || ')'; commit; end loop; end proc1;
執(zhí)行proc1后:
Proc1存儲過程使用了動態(tài)SQL,這樣就會在每次執(zhí)行insert語句時,要對每一個insert語句進行硬解析,這樣就增加了共享池的硬解析開銷,下面是v$sqlarea視圖中的結(jié)果
19:23:20 SYS@ prod> select sql_text ,PARSE_CALLS ,EXECUTIONS from v$sqlarea where sql_text like 'insert into t%';
SQL_TEXT PARSE_CALLS EXECUTIONS
-------------------------------------------------- ----------- ----------
insert into t values (56386) 1 1
insert into t values (58271) 1 1
insert into t values (57503) 1 1
insert into t values (58762) 1 1
insert into t values (58158) 1 1
insert into t values (57081) 1 1
insert into t values (57574) 1 1
insert into t values (56146) 1 1
insert into t values (58674) 1 1
insert into t values (56186) 1 1
insert into t values (56548) 1 1
insert into t values (57817) 1 1
insert into t values (56534) 1 1
insert into t values (56678) 1 1
insert into t values (56758) 1 1
insert into t values (57501) 1 1
insert into t values (56959) 1 1
2)綁定變量
create or replace procedure proc2 as begin for i in 1 .. 100000 loop execute immediate 'insert into t values(:X)' using i; commit; end loop; end proc2;
執(zhí)行proc2:
Proc2存儲過程使用了綁定變量,這樣在執(zhí)行過程上,就會減少硬解析的開銷,降低共享池的爭用。在執(zhí)行過程中,v$sqlarea視圖中的結(jié)果如下
19:29:21 SYS@ prod>select sql_text ,PARSE_CALLS ,EXECUTIONS from v$sqlarea where sql_text like 'insert into t%';
SQL_TEXT PARSE_CALLS EXECUTIONS
-------------------------------------------------- ----------- ----------
insert into t values(:X) 1 100000
Elapsed: 00:00:00.08
insert語句并沒有解析1次執(zhí)行1次,而是解析了1次,執(zhí)行了10萬次。
3)靜態(tài)SQL
create or replace procedure proc3 as begin for i in 1 .. 100000 loop insert into t values(i); end loop; end proc3;
執(zhí)行proc3:
Proc3存儲過程使用了靜態(tài)SQL,這樣在編譯過程中insert語句就解析好了,而不像proc2存儲過程需要在執(zhí)行過程中再解析,這樣節(jié)省了一些時間,具體的測試結(jié)果如下
19:40:46 SYS@ prod>select sql_text ,PARSE_CALLS ,EXECUTIONS from v$sqlarea 19:40:59 2 where sql_text like 'INSERT INTO T%';:
SQL_TEXT PARSE_CALLS EXECUTIONS
-------------------------------------------------- ----------- ----------
INSERT INTO T VALUES(:B1 ) 0 100000
Elapsed: 00:00:00.05
在靜態(tài)SQL中,insert語句也是使用了綁定變量,所以也是解析1次,然后多次執(zhí)行。
2、測試總結(jié)
動態(tài)SQL適用于表名及查詢字段名未知的情況。在已知查詢字段名及表名的情況下,使用動態(tài)SQL(字符串拼接方式)會增加硬解析的開銷,在這種情況下,建議使用靜態(tài)SQL,這樣可以提高執(zhí)行效率。在存儲過程用拼湊的動態(tài)sql效率并不高,有時候還不如程序直接傳遞sql.靜態(tài)SQL是前置編譯綁定,動態(tài)SQL是后期執(zhí)行時才編譯綁定。