1. 程式人生 > 其它 >Oracle使用SPM對含有繫結變數SQL做固定的方法

Oracle使用SPM對含有繫結變數SQL做固定的方法

Oracle使用SPM對含有繫結變數SQL做固定的方法

一般SPM固定如果目標SQL沒有繫結變數,那麼直接對目標SQL新增HINT然後產生的執行計劃用SPM來“偷天換日”。

如果是含有繫結變數,這裡有兩種情況。

情況1:select * from t where t.id=:A;

這種情況可以使用定義變數A後賦值然後新增HINT到含有繫結變數的原SQL中執行以獲取想要的執行計劃然後用SPM替換並固定。

var A number;
exec :A := 100;
select * from t where t.id=:A;

--獲取SQL_ID和執行計劃(含有Plan Hash值)
select
* from table(dbms_xplan.display_cursor(null,null,'allstats last'));

情況2:select * from t where t.id=:1;

由於變數名無法用資料定義,因此情況1不適用。

可以通過檢視DBA_HIST_SQLBIND或者GV$SQL_BIND_CAPTURE獲取繫結變數值然後直接替換到原SQL中,獲取想要的執行計劃然後用SPM替換並固定。

經過兩次不同SQL的測試,此種方式是可行的。