在進行 SQL 調優或問題排查時,獲取綁定變數的實際值至關重要。Oracle 提供了兩種主要途徑:從共享池即時查詢,以及從 AWR 歷史記錄中查詢。本文整理了實用的查詢腳本與使用場景。
適用場景:目標 SQL 仍駐留在共享池中,未被 aged out。
alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss';
set linesize 400
col sql_Id format a20
col name format a20
col datatype_string format a14
col value_string format a20
select sql_id,
name,
datatype_string,
last_captured,
value_string
from v$sql_bind_capture
where sql_id = 'dxfcacn4t4ppw' -- 請替換為實際 SQL_ID
order by LAST_CAPTURED, POSITION;
關鍵說明:
v$sql_bind_capture:每 15 分鐘捕獲一次綁定變數值(由 _cursor_bind_capture_interval 控制)last_captured:捕獲時間,可判斷數據新鮮度value_string:顯示綁定變數的字串表示值適用場景:SQL 已從共享池淘汰,但 AWR 保留了歷史快照。
select instance_number,
sql_id,
name,
datatype_string,
last_captured,
value_string
from dba_hist_sqlbind
where sql_id = 'fahv8x6ngrb50' -- 請替換為實際 SQL_ID
order by LAST_CAPTURED, POSITION;
關鍵說明:
dba_hist_sqlbind:AWR 快照保存的綁定變數歷史資料instance_number:RAC 環境下區分不同實例SELECT_CATALOG_ROLE 或 DBA 權限才能查詢EXPLAIN PLAN 驗證實際執行計畫datatype_string 顯示型別(如 VARCHAR2, NUMBER, DATE),value_string 為字串格式,日期需注意格式轉換_cursor_bind_capture_interval 調整捕獲間隔(預設 900 秒)| 問題 | 可能原因 | 解決建議 |
|---|---|---|
| 查無資料 | SQL_ID 錯誤、SQL 已 aged out、AWR 未捕獲 | 確認 SQL_ID、檢查 v$sqlarea、調整 AWR 保留天數 |
| 值顯示為空 | 綁定變數未被捕獲、資料型別不支援顯示 | 強制硬解析、檢查 datatype_string 是否為支援型別 |
| RAC 環境資料不全 | 僅查詢單一實例 | 加入 instance_number 條件或查詢所有實例 |