ORACLE 透過SPM為SQL語句加HINT

巴扎黑
發布: 2016-11-21 15:25:33
原創
1225 人瀏覽過

一個SQL,透過SPM固定它的執行計劃,可以透過DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE實現。也可以通地此功能在不修改原SQL的情況下對其加HINT來固定執行計劃。

DB VERSION:ORACLE 11.2.0.4
OS:CENTOS 6.6

例如:
原SQL走索引:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID_10; SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;

在V$SQL中查詢出,原SQL的SQL_ID=064qcdmgt6thw,加上HINT的LAN_IDUEUE
。用加HINT的SQL的SQL_ID和PLAN_HASH_VALUE,來固定原語句的SQL
  CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID                                        PLAN 的                               SQL_TEXT     的執行計劃固定在原語句上。執行原語句,在V$SQL的PLAN_HASH_VALUE欄位和SQL_PLAN_BASELINE欄位來確認是否固定。

測試中發現,一些含有綁定變數的SQL,用常數的SQL的SQL_ID和PLAN_HASH_VALUE無法固定,此時可以嘗試使用EXECUTE IMMEDIATE產生含有綁定變數的SQL。
例如:
DECLARE
  V_SQL VARCHAR2(3000);
BEGIN
  V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPMWHERE OBJECT_TB_SPM)*/* FROM SCOTT.TB_SPMWHERE 1ECT_TB_SPM)*/  USING 10;
END;

var v number;
exec :v :=10
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!