Oracle 通過註釋改變執行計劃

chenoracle發表於2018-05-14

Oracle 通過註釋改變執行計劃

 

一:問題現象

T_XXX 表同步延時 1 小時,其它表同步速度正常

主要慢在同步時的一個 delete T_XXX 語句上,單條執行耗時 12 秒;

 

二:問題原因

T_XXX 表存在唯一性索引,理論上速度很快;

檢視 T_XXX 表存在 delete 行級觸發器,檢視觸發器邏輯,發現觸發器內一個 update 語句特別慢;

UPDATE CHENJCH.T_CHENJCH_RISK ..where  RISK_ID ....

檢視執行計劃, update 語句走全表掃描,速度很慢,通過 hint 強制走主鍵索引,速度特別快;

 

為什麼執行計劃不走主鍵?

檢視 T_CHENJCH_RISK 表統計資訊顯示錶有 0 行資料,但是實際上有 200 萬行資料;

由於資料同步時 T_CHENJCH_RISK 表存在大量的 delete/update/insert 操作,上次收集統計資訊時正好這個表裡沒有資料,但是經過幾天的資料同步後,表裡的資料量發生了很大變化,統計資訊也不是實時進行收集,最終導致生成較差的執行計劃;

 

解決方案:

嘗試刪除 T_CHENJCH_RISK 表統計資訊,讓資料庫通過動態取樣實時的收據資訊,但是執行計劃沒有變,還是走全表掃描,速度沒有提高;

begin

  dbms_stats.delete_table_stats(ownname => 'CHENJCH', tabname => 'T_CHENJCH_RISK');

end;

 

嘗試重新收集 T_CHENJCH_RISK 表統計資訊,讓資料庫通過動態取樣實時的收據資訊,但是執行計劃沒有變,還是走全表掃描,速度沒有提高;

begin

  DBMS_STATS.GATHER_TABLE_STATS('CHENJCH',

                                'T_CHENJCH_RISK',

                                estimate_percent => 100,

                                method_opt       => 'FOR ALL INDEXED COLUMNS',

                                degree           => 6,

                                CASCADE          => TRUE);

end;

 

為什麼執行計劃沒有變?

(資料庫版本 Oracle 12.2.0.1.0)

因為 SQL 語句存在繫結變數, SQL 文字沒有變,導致執行計劃也沒有發生變化;

通過對錶 T_CHENJCH_RISK 新增和刪除註釋,可以讓資料庫重新生成執行計劃;

comment on column CHENJCH.T_CHENJCH_RISK.RISK_ID   is  'PK_T_CHENJCH_RISK';

comment on column CHENJCH.T_CHENJCH_RISK.RISK_ID   is  '';

檢視新生成的執行計劃, T_CHENJCH_RISK 已經開始走主鍵索引了,速度有明顯提升;

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

Oracle 通過註釋改變執行計劃

Oracle 通過註釋改變執行計劃



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2154445/,如需轉載,請註明出處,否則將追究法律責任。

相關文章