PLSQL_查詢已執行SQL的繫結引數(案例)
一、摘要
在做諮詢時,經查遇到以前SQL的執行情況,和查詢使用的條件
查詢繫結變數時,有硬解析和軟解析之分,如果是軟解析,變數的值就很難找到了
查詢繫結變數的幾個檢視如下:
- 查詢v$sql檢視
- 查詢v$sql_bind_capture
- 查詢dba_hist_sqlbind
- 查詢wrh$sqlstat
二、查詢v$sql檢視
1. 查詢bind_data
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;
2. bind_data
select dbms_sqltune.extract_binds(bind_data) bind from v$sql where sql_text like '%FROM TEST11%';
此時查詢到的data值得形式是這樣的:BEDA0B2002004F8482D10065FFFF0F000000003132303431313,需要通過dbms_sqltune.extract_binds進行轉換
三、查詢v$sql_bind_capture
通過v$sql_bind_capture檢視,可以檢視繫結變數,但是這個檢視不太給力,只能捕獲最後一次記錄的繫結變數值。
而且兩次捕獲的間隔有一個隱含引數控制。預設是900秒,才會重新開始捕獲。在900內,繫結變數值的改變不會反應在這個檢視中。
10G以後可以通過如下方法檢視AWR報告裡記錄的SQL的繫結變數值。
select value_string from v$sql_bind_capture where sql_id='abhf6n1xqgrr0';
四、查詢dba_hist_sqlbind
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語句中的位置,以1,2,3進行標註
----------value_string,就是繫結變數值
----------last_captured,最後捕獲到的時間
----------was_captured,是否繫結被捕獲,where子句前面的繫結不進行捕獲。
dba_hist_sqlbind檢視強大的地方在於,它記錄了每個AWR報告裡的SQL的繫結變數值,當然這個繫結變數值也是AWR生成的時候從v$sql_bind_capture取樣獲得的。
通過這個檢視,我們能夠獲得比較多的繫結變數值,對於我們排查問題,這些值一般足夠了。
還有一個需要注意的地方是,這兩個檢視中記錄的繫結變數只對where條件後面的繫結進行捕獲,這點需要使用的時候注意。
查詢 dba_hist_sqlbind value_string列
dba_hist_sqlbind是檢視v$sql_bind_capture歷史快照
五、查詢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等