擷取oracle sql語句中綁定變數值的方法,oraclesql
在診斷 sql的效能問題時,我們有時候需要擷取其綁定變數的實際值,然後將此實際值帶入到sql語句當中,用原來的sql構成select語句(帶where條件),實際的執行一下,看一下選擇性如何。
本文就是說擷取其綁定變數值的方法。本文的編寫得到枯榮長老的協助,在此表示感謝。
本文適用於與oracle 10G或者更高版本的db。
alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss';set linesize 400col sql_Id format a20col name format a20col datatype_string format a14col value_string format a20 --這個sql從記憶體中讀取綁定變數值資訊,若是不在記憶體中,則使用下一個sqlselect sql_id,name, datatype_string, last_captured,value_string from v$sql_bind_capture where sql_id='dxfcacn4t4ppw' order by LAST_CAPTURED,POSITION; --這個sql從awr中讀取綁定變數值資訊select instance_number, sql_id,name, datatype_string, last_captured,value_string from dba_hist_sqlbind where sql_id='fahv8x6ngrb50'order by LAST_CAPTURED,POSITION;
oracle 怎使用綁定變數
綁定變數介紹
2009/08/09 BY MACLEAN LIU 5 COMMENTS
Oracle在執行SQL語句時,普遍存在以下幾個步驟:
當SQL語句首次執行,Oracle將確認該句語句的文法是否正確(文法解析Syntax parse)並進一步確認語句相關表和列的存在性等因素(語義解析semantic parse)以及最佳化器決定執行計畫等步驟。整個過程稱之為硬解析,硬解析消耗大量的CPU時間和系統資源。硬解析過多會有效降低系統效能。
若之前已進行過硬解析,且解析後的分析樹和執行計畫仍存在於共用池中,則同樣的SQL僅需要軟解析。軟解析將輸入的SQL語句轉換為雜湊碼,同共用池內雜湊鏈表上的已有記錄進行對比,找出對應的遊標資訊,使用已有的執行計畫執行。
綁定變數,將實際的變數值代入SQL語句中。
執行SQL語句,查詢語句將返回結果集。
不使用綁定變數的SQL語句,Oracle無法將它們視為相同的,如以下兩句語句:
select * from emp where empno=1234
select * from emp where empno=5678
因為自由變數的不同,Oracle認為以上是2句不同的語句,則當第一條被硬解析後,第二條SQL執行時仍無法避免硬解析。實際在以上不使用綁定變數的情況中,只要自由變數有所改變則需要一次硬解析。這是強烈建議使用綁定變數的主要原因,使用綁定變數的語句變數的實際值僅在SQL執行的最後階段被代入。如以下語句:
select * from emp where empno=:x
該語句使用綁定值:x替代自由變數,在應用中語句可能以先行編譯或普通編譯的方式存在,僅在執行階段代入變數值,多次執行僅需要一次硬解析,較不使用綁定變數情況效能大大提升。
oracle sql語句怎引用變數
你的全域變數從哪裡來,就把那張表連過來給個別名不就能引用了嗎?
還有where裡面最好用datediff來去日期