小編給大家分享一下Oracle如何通過(guò)注釋改變執(zhí)行計(jì)劃,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司2013年至今,公司以網(wǎng)站制作、網(wǎng)站建設(shè)、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶近1000家,涉及國(guó)內(nèi)多個(gè)省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗(yàn)。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過(guò)專業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
Oracle 通過(guò)注釋改變執(zhí)行計(jì)劃
一:?jiǎn)栴}現(xiàn)象
T_XXX表同步延時(shí)1小時(shí),其它表同步速度正常;
主要慢在同步時(shí)的一個(gè)delete T_XXX語(yǔ)句上,單條執(zhí)行耗時(shí)12秒;
二:?jiǎn)栴}原因
T_XXX表存在唯一性索引,理論上速度很快;
查看T_XXX表存在delete行級(jí)觸發(fā)器,查看觸發(fā)器邏輯,發(fā)現(xiàn)觸發(fā)器內(nèi)一個(gè)update語(yǔ)句特別慢;
UPDATE CHENJCH.T_CHENJCH_RISK ..where RISK_ID ....
查看執(zhí)行計(jì)劃,update語(yǔ)句走全表掃描,速度很慢,通過(guò)hint強(qiáng)制走主鍵索引,速度特別快;
為什么執(zhí)行計(jì)劃不走主鍵?
查看T_CHENJCH_RISK表統(tǒng)計(jì)信息顯示表有0行數(shù)據(jù),但是實(shí)際上有200萬(wàn)行數(shù)據(jù);
由于數(shù)據(jù)同步時(shí)T_CHENJCH_RISK表存在大量的delete/update/insert操作,上次收集統(tǒng)計(jì)信息時(shí)正好這個(gè)表里沒(méi)有數(shù)據(jù),但是經(jīng)過(guò)幾天的數(shù)據(jù)同步后,表里的數(shù)據(jù)量發(fā)生了很大變化,統(tǒng)計(jì)信息也不是實(shí)時(shí)進(jìn)行收集,最終導(dǎo)致生成較差的執(zhí)行計(jì)劃;
解決方案:
嘗試刪除T_CHENJCH_RISK表統(tǒng)計(jì)信息,讓數(shù)據(jù)庫(kù)通過(guò)動(dòng)態(tài)取樣實(shí)時(shí)的收據(jù)信息,但是執(zhí)行計(jì)劃沒(méi)有變,還是走全表掃描,速度沒(méi)有提高;
begin
dbms_stats.delete_table_stats(ownname => 'CHENJCH', tabname => 'T_CHENJCH_RISK');
end;
嘗試重新收集T_CHENJCH_RISK表統(tǒng)計(jì)信息,讓數(shù)據(jù)庫(kù)通過(guò)動(dòng)態(tài)取樣實(shí)時(shí)的收據(jù)信息,但是執(zhí)行計(jì)劃沒(méi)有變,還是走全表掃描,速度沒(méi)有提高;
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í)行計(jì)劃沒(méi)有變?
(數(shù)據(jù)庫(kù)版本Oracle 12.2.0.1.0)
因?yàn)镾QL語(yǔ)句存在綁定變量,SQL文本沒(méi)有變,導(dǎo)致執(zhí)行計(jì)劃也沒(méi)有發(fā)生變化;
通過(guò)對(duì)表T_CHENJCH_RISK添加和刪除注釋,可以讓數(shù)據(jù)庫(kù)重新生成執(zhí)行計(jì)劃;
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í)行計(jì)劃,T_CHENJCH_RISK已經(jīng)開始走主鍵索引了,速度有明顯提升;
以上是“Oracle如何通過(guò)注釋改變執(zhí)行計(jì)劃”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!