您好,登錄后才能下訂單哦!
動態(tài)SQL和靜態(tài)SQL及綁定變量性能對比
1、測試樣例
下面的三個(gè)存儲過程,分別使用了動態(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語句時(shí),要對每一個(gè)insert語句進(jìn)行硬解析,這樣就增加了共享池的硬解析開銷,下面是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é)省了一些時(shí)間,具體的測試結(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效率并不高,有時(shí)候還不如程序直接傳遞sql.靜態(tài)SQL是前置編譯綁定,動態(tài)SQL是后期執(zhí)行時(shí)才編譯綁定。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。