透過v$sql_bind_capture 檢視繫結變數。

kunlunzhiying發表於2018-04-11

最近在排查CRMG效能SQL的過程中,大量的SQL需要確定繫結變數的值,如果一個個聯絡開發確定,效率太低。還有一些技術手段比如10046LOGMINER又複雜的要死。

大多數人都知道透過v$sql_bind_capture檢視,可以檢視繫結變數,但是這個檢視不太給力,只能捕獲最後一次記錄的繫結變數值。

而且兩次捕獲的間隔有一個隱含引數控制。預設是900秒,才會重新開始捕獲。在900內,繫結變數值的改變不會反應在這個檢視中。

10G以後可以透過如下方法檢視AWR報告裡記錄的SQL的繫結變數值。

 

select snap_id, name, position, value_string,last_captured,WAS_CAPTURED  from dba_hist_sqlbind  where sql_id = '576c1s91gua19' and snap_id='20433';

 

 

 

----------SNAP_ID就是AWR報告的快照ID

----------name,繫結變數的名稱

----------position,繫結值在SQL語句中的位置,以123進行標註  

---------value_string ,就是繫結變數值

---------,last_captured,最後捕獲到的時間

--------- WAS_CAPTURED,是否繫結被捕獲,where子句前面的繫結不進行捕獲。

 

dba_hist_sqlbind檢視強大的地方在於,它記錄了每個AWR報告裡的SQL的繫結變數值,當然這個繫結變數值也是AWR生成的時候從v$sql_bind_capture取樣獲得的。

透過這個檢視,我們能夠獲得比較多的繫結變數值,對於我們排查問題,這些值一般足夠了。

還有一個需要注意的地方是,這兩個檢視中記錄的繫結變數只對where條件後面的繫結進行捕獲,這點需要使用的時候注意。


sys@CRMG>SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2    FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3   WHERE x.inst_id = USERENV ('Instance')
  4     AND y.inst_id = USERENV ('Instance')
  5     AND x.indx = y.indx
  6     AND x.ksppinm LIKE '%&par%'
  7  /
Enter value for par: bind_ca
old   6:    AND x.ksppinm LIKE '%&par%'
new   6:    AND x.ksppinm LIKE '%bind_ca%'

NAME                           VALUE                DESCRIB
------------------------------ -------------------- ------------------------------------------------------------
_cursor_bind_capture_area_size 400                  maximum size of the cursor bind capture area
_cursor_bind_capture_interval  
900                 interval (in seconds) between two bind capture for a cursor

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2152791/,如需轉載,請註明出處,否則將追究法律責任。

相關文章