真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

 



標(biāo)題名稱:動態(tài)SQL和靜態(tài)SQL及綁定變量性能對比
轉(zhuǎn)載源于:http://weahome.cn/article/peojpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部