共計 1259 個字符,預(yù)計需要花費 4 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Oracle 如何通過注釋改變執(zhí)行計劃,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Oracle 通過注釋改變執(zhí)行計劃
一:問題現(xiàn)象
T_XXX 表同步延時 1 小時,其它表同步速度正常;
主要慢在同步時的一個 delete T_XXX 語句上,單條執(zhí)行耗時 12 秒;
二:問題原因
T_XXX 表存在唯一性索引,理論上速度很快;
查看 T_XXX 表存在 delete 行級觸發(fā)器,查看觸發(fā)器邏輯,發(fā)現(xiàn)觸發(fā)器內(nèi)一個 update 語句特別慢;
UPDATE CHENJCH.T_CHENJCH_RISK ..where RISK_ID ….
查看執(zhí)行計劃,update 語句走全表掃描,速度很慢,通過 hint 強制走主鍵索引,速度特別快;
為什么執(zhí)行計劃不走主鍵?
查看 T_CHENJCH_RISK 表統(tǒng)計信息顯示表有 0 行數(shù)據(jù),但是實際上有 200 萬行數(shù)據(jù);
由于數(shù)據(jù)同步時 T_CHENJCH_RISK 表存在大量的 delete/update/insert 操作,上次收集統(tǒng)計信息時正好這個表里沒有數(shù)據(jù),但是經(jīng)過幾天的數(shù)據(jù)同步后,表里的數(shù)據(jù)量發(fā)生了很大變化,統(tǒng)計信息也不是實時進行收集,最終導(dǎo)致生成較差的執(zhí)行計劃;
解決方案:
嘗試刪除 T_CHENJCH_RISK 表統(tǒng)計信息,讓數(shù)據(jù)庫通過動態(tài)取樣實時的收據(jù)信息,但是執(zhí)行計劃沒有變,還是走全表掃描,速度沒有提高;
begin
dbms_stats.delete_table_stats(ownname = CHENJCH , tabname = T_CHENJCH_RISK
end;
嘗試重新收集 T_CHENJCH_RISK 表統(tǒng)計信息,讓數(shù)據(jù)庫通過動態(tài)取樣實時的收據(jù)信息,但是執(zhí)行計劃沒有變,還是走全表掃描,速度沒有提高;
begin
DBMS_STATS.GATHER_TABLE_STATS(CHENJCH ,
T_CHENJCH_RISK ,
estimate_percent = 100,
method_opt = FOR ALL INDEXED COLUMNS ,
degree = 6,
CASCADE = TRUE);
end;
為什么執(zhí)行計劃沒有變?
(數(shù)據(jù)庫版本 Oracle 12.2.0.1.0)
因為 SQL 語句存在綁定變量,SQL 文本沒有變,導(dǎo)致執(zhí)行計劃也沒有發(fā)生變化;
通過對表 T_CHENJCH_RISK 添加和刪除注釋,可以讓數(shù)據(jù)庫重新生成執(zhí)行計劃;
comment on column CHENJCH.T_CHENJCH_RISK.RISK_ID is PK_T_CHENJCH_RISK
comment on column CHENJCH.T_CHENJCH_RISK.RISK_ID is
查看新生成的執(zhí)行計劃,T_CHENJCH_RISK 已經(jīng)開始走主鍵索引了,速度有明顯提升;
以上是“Oracle 如何通過注釋改變執(zhí)行計劃”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!