您好,登錄后才能下訂單哦!
本篇內容主要講解“sql查找未使用綁定變量的語句”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“sql查找未使用綁定變量的語句”吧!
一、查找方法:
從ORACLE10G開始,V$SQL視圖中增加列FORCE_MATCHING_SIGNATURE:Signature used when the CURSOR_SHARING parameter is set to FORCE;(當CURSOR_SHARING參數設置成FORCE時,產生的執行計劃是一樣的)
測試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說明:當name值不一樣的時候FORCE_MATCHING_SIGNATURE的值相同,而EXACT_MATCHING_SIGNATURE值不同,說明在cursor_sharing=force時,執行計劃可共用;cursor_sharing=exact時,執行計劃不可共用;我們使用綁定變量后,同樣也可以達到執行計劃共用的效果;
測試2:cursor_sharing值為FORCE
1、執行語句: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、同樣執行三條查詢語句
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說明:當我們把cursor_sharing設置為force后,發現語句執行計劃共用了,并且自動使用綁定變量(此時v$sql視圖中只查詢到一條與之相關的語句)。
測試3、cursor_sharing值為EXACT,但使用綁定變量
1、執行語句: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總結:當我們把cursor_sharing設置為EXACT后,并通過綁定變量查詢,發現語句執行計劃共用了;
二、解決方法
通過以上測試已經了解:如果V$SQL里面的FORCE_MATCHING_SIGNATURE值一樣的SQL語句,那么就可以通過綁定變量來進行相應的優化了。
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查找未使用綁定變量的語句”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。