Oracle使用SPM對含有繫結變數SQL做固定的方法
阿新 • • 發佈:2021-11-03
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的測試,此種方式是可行的。