V$sql查詢未使用繫結變數的語句
前言:
由於各種原因(開發人員的技術水平、開發的管理規範、趕進度),系統在執行一段時間後,發現效能越來越慢。這時候往往是DBA發揮價值的時候到了,DBA透過檢視資料庫的AWR報告,如果發現以下值Library Hit、Soft Parse偏低(95%以下),Hard parses偏高。那就很有可能是資料庫太多語句未使用繫結變數引起的。
DBA可以透過v$sq檢視定期抓取一些未使用繫結變數的語句,並由開發進行相應的程式最佳化,逐步改善系統執行緩慢的問題;
一、查詢方法:
從ORACLE10G開始,V$SQL檢視中增加列FORCE_MATCHING_SIGNATURE:Signature used when the CURSOR_SHARING parameter is set to FORCE;(當CURSOR_SHARING引數設定成FORCE時,產生的執行計劃是一樣的)
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 t where 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. |
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 t where 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; |
找到語句後,剩下的工作就交給開發人員進行修改了,DBA又為整個系統效能的提高立了一大功。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本文作者:JOHN
ORACLE技術部落格:ORACLE 獵人筆記 資料庫技術群:367875324 (請備註ORACLE管理 )
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156889/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- SQL單表查詢語句總結SQL
- SQL mother查詢語句SQL
- sql查詢語句流程SQL
- SQL查詢語句 (Oracle)SQLOracle
- mysql查詢效率慢的SQL語句MySql
- postgresql dba常用sql查詢語句SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL基礎的查詢語句烈鉍SQL
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 在mysql查詢效率慢的SQL語句MySql
- SQL語句替換查詢結果的的寫法舉例SQL
- sql宣告變數,及if -else語句、while語句的用法SQL變數While
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- SQL Server 語句日期格式查詢方法SQLServer
- SQL Server-簡單查詢語句SQLServer
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- SQL 查詢語句的執行順序解析SQL
- [20210112]ashtop查詢特定表的SQL語句.txtSQL
- Sql語句本身的優化-定位慢查詢SQL優化
- 記一個實用的sql查詢語句SQL
- JAVA 中使用 SQL 語句查詢 EXCEL 檔案資料JavaSQLExcel
- ORACLE結構化查詢語句Oracle
- Mybatis 查詢語句結果集總結MyBatis
- 一條 SQL 查詢語句是如何執行的?SQL
- 20201214]查詢隱式轉換的sql語句.txtSQL
- [20201214]查詢隱式轉換的sql語句.txtSQL
- 查詢策略選擇:使用 JOIN 還是多條 SQL 語句SQL
- SQL語句將查詢結果插入到另一張表中SQL
- [20210112]完善查詢繫結變數指令碼bind_cap.txt變數指令碼
- hisql ORM 查詢語句使用教程SQLORM
- 輸入的查詢 SQL 語句,是如何執行的?SQL
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- GaussDB SQL查詢語句執行過程解析SQL
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- [20210113]ashtop查詢特定表的SQL語句2.txtSQL
- SQL語言(結構化查詢語言)SQL