oracle資料庫獲取繫結變數的各種方法

531968912發表於2016-12-22
1、查詢v$sql檢視
       select sql_id, sql_text, bind_data,HASH_VALUE from v$sql   where sql_text Like '%select * from test where id1%';
它的記錄頻率受_cursor_bind_capture_interval 隱含引數控制,預設值900,表示每900秒記錄一次繫結值,可以透過alter system set "_cursor_bind_capture_interval"=10;


此時查詢到的data值得形式是這樣的:BEDA0B2002004F8482D10065FFFF0F00000000000000000000C0021602C102C0021602C102F0018003691532303132303431313032504F443834363135313635F0018003691532303132303431313032504F443834363135313730F0018003691532303132303431313032504F443834363135313731F0018003691532303132303431313032504F443834363135313734F0018003691532303132303431313032504F443834363135313735F0018003691532303132303431313032504F443834363135313739F0018003691532303132303431313032504F443834363135313830F0018003691532303132303431313032504F443834363135313833F0018003691532303132303431313032504F443834363135313834F0018003691532303132303431313032504F443834363135313838F0018003691532303132303431313032504F443834363135313839F0018003691532303132303431313032504F443834363135313933F0018003691532303132303431313032504F443834363135313934F0018003691532303132303431313032504F443834363135313937F0018003691532303132303431313032504F443834363135313938F0018003691532303132303431313032504F443834363135323033F0018003691532303132303431313032504F443834363135323034F0018003691532303132303431313032504F443834363135323037
這樣肯定是沒法看懂的


需喲進行轉換
select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE SQL_TEXT LIKE '%FROM TEST11%';




2、查詢 SELECT VALUE_STRING FROM V$SQL_BIND_CAPTURE WHERE SQL_ID='abhf6n1xqgrr0';
透過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';
 
 
select snap_id,
       t.dbid,
       t.instance_number,
       name,
       position,
       t.datatype,
       t.datatype_string,
       value_string,
       last_captured,
       WAS_CAPTURED
  from dba_hist_sqlbind t
 where sql_id = '1ps1ckbnf3b88'


 
----------SNAP_ID就是AWR報告的快照ID。
----------name,繫結變數的名稱
----------position,繫結值在SQL語句中的位置,以1,2,3進行標註  
---------value_string,就是繫結變數值
---------,last_captured,最後捕獲到的時間
---------WAS_CAPTURED,是否繫結被捕獲,where子句前面的繫結不進行捕獲。
dba_hist_sqlbind檢視強大的地方在於,它記錄了每個AWR報告裡的SQL的繫結變數值,當然這個繫結變數值也是AWR生成的時候從v$sql_bind_capture取樣獲得的。
透過這個檢視,我們能夠獲得比較多的繫結變數值,對於我們排查問題,這些值一般足夠了。
還有一個需要注意的地方是,這兩個檢視中記錄的繫結變數只對where條件後面的繫結進行捕獲,這點需要使用的時候注意。
3、查詢 dba_hist_sqlbind VALUE_STRING列
 DBA_HIST_SQLBIND是檢視V$SQL_BIND_CAPTURE歷史快照


4、查詢wrh$_sqlstat
     select dbms_sqltune.extract_bind(bind_data, 1).value_string
     from wrh$_sqlstat
      where sql_id = '88dz0k2qvg876'----根據繫結變數的多少增加dbms_sqltune.extract_bind(bind_data, 2).value_string等
     
     
5.根據基表獲取繫結變數的方法:      
 select dbms_sqltune.extract_bind(bind_data, 1).value_string||'-'|| dbms_sqltune.extract_bind(bind_data, 2).value_string ||'-'|| dbms_sqltune.extract_bind(bind_data, 3)
       .value_string ||'-'|| dbms_sqltune.extract_bind(bind_data, 4).value_string ||'-'|| dbms_sqltune.extract_bind(bind_data, 5)
       .value_string ||'-'|| dbms_sqltune.extract_bind(bind_data, 6).value_string
  from wrh$_sqlstat
 where sql_id = '05gp0u2vtckb1'
/

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

相關文章