1. 程式人生 > >PLSQL_查詢已執行SQL的繫結引數(案例)

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等