溫馨提示×

溫馨提示×

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

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

sql查找未使用綁定變量的語句

發(fā)布時(shí)間:2021-09-14 12:47:04 來源:億速云 閱讀:206 作者:chen 欄目:關(guān)系型數(shù)據(jù)庫

本篇內(nèi)容主要講解“sql查找未使用綁定變量的語句”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“sql查找未使用綁定變量的語句”吧!

一、查找方法:

從ORACLE10G開始,V$SQL視圖中增加列FORCE_MATCHING_SIGNATURESignature used when the CURSOR_SHARING parameter is set to FORCE;(當(dāng)CURSOR_SHARING參數(shù)設(shè)置成FORCE時(shí),產(chǎn)生的執(zhí)行計(jì)劃是一樣的)

測試1:cursor_sharing值為EXACT

SQL>  show parameter cursor_sharing;

 

NAME                           TYPE           VALUE

------------------------------------ ----------- ---------------------

cursor_sharing                    string           EXACT

SQL>SELECT /*john*/* from bas.john  where name='曹定芳';

 

SQL>SELECT /*john*/* from bas.john  where name='張杰雄';

    

SQL>SELECT /*john*/* from bas.john  where name='練為斌';

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql twhere sql_text like'%john%';

 

SQL_TEXT                                              FORCE_MATCHING_SIGNATURE     EXACT_MATCHING_SIGNATURE    

----------------------------------------------------   ---------------------      -----------------------------

SELECT /*john*/* from bas.john  where name='曹定芳'    1.58728914732591E19         8.65016113461197E18

SELECT /*john*/* from bas.john  where name='張杰雄'    1.58728914732591E19         1.55664749687513E19

SELECT /*john*/* from bas.john  where name='練為斌'    1.58728914732591E19         6.34382341893161E18        

測試1說明:當(dāng)name值不一樣的時(shí)候FORCE_MATCHING_SIGNATURE的值相同,而EXACT_MATCHING_SIGNATURE值不同,說明在cursor_sharing=force時(shí),執(zhí)行計(jì)劃可共用;cursor_sharing=exact時(shí),執(zhí)行計(jì)劃不可共用;我們使用綁定變量后,同樣也可以達(dá)到執(zhí)行計(jì)劃共用的效果;

測試2:cursor_sharing值為FORCE

1、執(zhí)行語句:alter system set cursor_sharing=force;

SQL> alter system set cursor_sharing=force;

 

System altered.

 

SQL> show parameter cursor_sharing;

 

NAME                           TYPE          VALUE

---------------------------       ---------    -----------

cursor_sharing                 string          FORCE

 

SQL> alter system flush shared_pool;

 

System altered.

2、同樣執(zhí)行三條查詢語句

SQL>SELECT /*john*/* from bas.john  where name='曹定芳';

 

SQL>SELECT /*john*/* from bas.john  where name='張杰雄';

 

SQL>SELECT /*john*/* from bas.john  where name='練為斌';

3、查找V$SQL的語句情況

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql t where sql_text like '%john%';

SQL_TEXT                                              FORCE_MATCHING_SIGNATURE     EXACT_MATCHING_SIGNATURE    

----------------------------------------------------   ---------------------      -----------------------------

SELECT /*john*/* from bas.john  where name=:"SYS_B_0"    1.58728914732591E19         1.58728914732591E19      

測試2說明:當(dāng)我們把cursor_sharing設(shè)置為force后,發(fā)現(xiàn)語句執(zhí)行計(jì)劃共用了,并且自動使用綁定變量(此時(shí)v$sql視圖中只查詢到一條與之相關(guān)的語句)。

測試3、cursor_sharing值為EXACT,但使用綁定變量

1、執(zhí)行語句:alter system set cursor_sharing=EXACT;

SQL> alter system set cursor_sharing=force;

 

System altered.

 

SQL> show parameter cursor_sharing;

 

NAME                           TYPE          VALUE

---------------------------       ---------    -----------

cursor_sharing                 string          EXACT

 

SQL> alter system flush shared_pool;

 

System altered.

2、使用綁定變量查詢

SQL>SELECT /*john*/* from bas.john  where name=:a;    

3、查找V$SQL的語句情況

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql twhere sql_text like'%john%';

 

SQL_TEXT                                              FORCE_MATCHING_SIGNATURE     EXACT_MATCHING_SIGNATURE    

----------------------------------------------------   ---------------------      -----------------------------

SELECT /*john*/* from bas.john  where name=:a           1.4513622515145E19        1.4513622515145E19

測試3總結(jié):當(dāng)我們把cursor_sharing設(shè)置為EXACT后,并通過綁定變量查詢,發(fā)現(xiàn)語句執(zhí)行計(jì)劃共用了;

二、解決方法

通過以上測試已經(jīng)了解:如果V$SQL里面的FORCE_MATCHING_SIGNATURE值一樣的SQL語句,那么就可以通過綁定變量來進(jìn)行相應(yīng)的優(yōu)化了。

select to_char(FORCE_MATCHING_SIGNATURE) as FORCE_MATCHING_SIGNATURE, count(1) as counts

from v$sql

where FORCE_MATCHING_SIGNATURE>0 and FORCE_MATCHING_SIGNATURE <> EXACT_MATCHING_SIGNATURE

group by FORCE_MATCHING_SIGNATURE

having count(1) > &a

order by 2 desc;

到此,相信大家對“sql查找未使用綁定變量的語句”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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)容。

sql
AI