日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

解决oracle绑定变量重复,基于ORACLE SQL优化之绑定变量(4)

發(fā)布時(shí)間:2024/10/8 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决oracle绑定变量重复,基于ORACLE SQL优化之绑定变量(4) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

綁定變量的使用過(guò)程當(dāng)中,oracle建議綁定變量的個(gè)數(shù)不宜太多。目標(biāo)SQL的SQL文本中的綁定變量個(gè)數(shù)不宜太多,否則可能會(huì)導(dǎo)致目標(biāo)SQL總的執(zhí)行時(shí)間大幅度的增長(zhǎng)。增長(zhǎng)的時(shí)間主要消耗在執(zhí)行目標(biāo)SQL時(shí)對(duì)每一個(gè)綁定變量都用其實(shí)際的值來(lái)替換(這個(gè)過(guò)程就是所謂的綁定變量值替換),目標(biāo)SQL的SQL文本中的綁定變量的個(gè)數(shù)越多,這個(gè)替換過(guò)程所消耗的時(shí)間就越長(zhǎng),該SQL總的執(zhí)行時(shí)間也就越長(zhǎng)。

如下為測(cè)試示例:

創(chuàng)建一張測(cè)試表t1,并建立一個(gè)過(guò)程

SQL>create table t1 as select*from dba_objects;

表已創(chuàng)建。

SQL>create or replace procedure P_GENERATE_MANY_BIND_V_DEMO

2(i_n_bind_v_number number,

3o_vc_return_flag out varchar2)is

4

5vc_sql varchar2(32767);

6vc_inlist varchar2(32767);

7n_temp number;

8begin

9vc_inlist:='1';

10fori in2..i_n_bind_v_number loop

11vc_inlist:=vc_inlist||','||to_char(i);

12end loop;

13

14vc_sql:='select count(*) from t1 where object_id in

('||vc_inlist||')'

15||' or object_id in ('||vc_inlist||')'

16||' or object_id in ('||vc_inlist||')'

17||' or object_id in ('||vc_inlist||')'

18||' or object_id in ('||vc_inlist||')'

19||' or object_id in ('||vc_inlist||')';

20execute immediate vc_sql into n_temp;

21

22o_vc_return_flag:=to_char(n_temp);

23exception

24when others then

25o_vc_return_flag:='E'||'_'||sqlcode||'_'||sqlerrm;

26return;

27end P_GENERATE_MANY_BIND_V_DEMO;

28/

過(guò)程已創(chuàng)建。

在存儲(chǔ)過(guò)程P_GENERATE_MANY_BIND_V_DEMO中根據(jù)傳進(jìn)來(lái)的輸入?yún)?shù)i_n_bind_v_number值構(gòu)造字符串vc_inlist,并用6個(gè)vc_inlist構(gòu)造目標(biāo)SQL。

執(zhí)行存儲(chǔ)過(guò)程:

SQL>alter sessionsetcursor_sharing='EXACT';

會(huì)話已更改。

SQL>alter system flush shared_pool;

系統(tǒng)已更改。

SQL>setserveroutput on size100000

SQL>var vc_temp varchar2(4000)

SQL>alter sessionsetevents'10046 trace name context forever,level 12';

會(huì)話已更改。

SQL>settiming on

SQL>exec P_GENERATE_MANY_BIND_V_DEMO(1000,:vc_temp);

PL/SQL過(guò)程已成功完成。

已用時(shí)間:00:00:00.25

SQL>alter sessionsetevents'10046 trace name context off';

會(huì)話已更改。

看到執(zhí)行時(shí)間是0.25秒,且從10046的trace文件中看出

關(guān)鍵字中e=43655,e是elapsed time的縮寫,單位是微秒,1s=1000000微秒,即是0.044s

然后再?gòu)?qiáng)制cursor_sharing為force,再次執(zhí)行如上步驟:

SQL>alter system flush shared_pool;

系統(tǒng)已更改。

SQL>settiming on

SQL>exec P_GENERATE_MANY_BIND_V_DEMO(998,:vc_temp);

PL/SQL過(guò)程已成功完成。

已用時(shí)間:00:00:02.31

SQL>alter system flush shared_pool;

系統(tǒng)已更改。

已用時(shí)間:00:00:00.33

SQL>alter sessionsetevents'10046 trace name context forever,level 12';

會(huì)話已更改。

已用時(shí)間:00:00:00.01

SQL>alter sessionsetcursor_sharing='FORCE';

會(huì)話已更改。

已用時(shí)間:00:00:00.00

SQL>exec P_GENERATE_MANY_BIND_V_DEMO(998,:vc_temp);

PL/SQL過(guò)程已成功完成。

已用時(shí)間:00:00:02.85

SQL>alter sessionsetevents'10046 trace name context off';

會(huì)話已更改。

已用時(shí)間:00:00:00.00

執(zhí)行結(jié)果看使用了5988個(gè)綁定變量,時(shí)間從0.25s增長(zhǎng)到2.85s,從10046trace文件看到

e=2171013,對(duì)應(yīng)時(shí)間為2.17s,占了執(zhí)行時(shí)間的一大半:

SQL>select2.17/2.85from dual;

2.17/2.85

----------

.761403509

已用時(shí)間:00:00:00.01

所以得到結(jié)論,綁定變量不宜過(guò)多,否則會(huì)造成比較嚴(yán)重的性能問(wèn)題。

=========================================================

the end!!!

總結(jié)

以上是生活随笔為你收集整理的解决oracle绑定变量重复,基于ORACLE SQL优化之绑定变量(4)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。