溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

動態(tài)SQL和靜態(tài)SQL及綁定變量性能對比

發(fā)布時(shí)間:2020-06-24 19:19:34 來源:網(wǎng)絡(luò) 閱讀:733 作者:客居天涯 欄目:關(guān)系型數(shù)據(jù)庫

動態(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í)才編譯綁定。

 





向AI問一下細(xì)節(jié)

免責(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)容。

AI