今天思前想後還是把一次失敗的優化 經歷寫下來吧, 防止以後再犯同樣的錯誤。 以後謹記教訓。
哎, 其實還差一點就到達我想要的效果了。
update st_mntr_bus_inteorder_oc a
set a.unreach = 1
where arch_flag = 0
and parent_tache_id = 2017
and a.create_dt < sysdate - 1 / 12
and a.create_dt > trunc(sysdate) - 30
and not exists (select 1
from st_mntr_zd_order_oc b
where a.sps_billsn = b.sps_billsn
and b.local_area_id = 3
and b.oc_time =66)
and a.local_area_id = 3
and a.oc_time =66; 監控中發現這條SQL需要跑 70多分鐘 。
那我做的第一個工作 就是 試着跑一下, 果真時間很長。 那優化唄.......
然後看了 執行計劃 , 一看嚇一跳 幾乎所有的表 數據條數都是 1, 自然就走了 filter 操作, 那我想到了統計信息出錯, 然後我試着去查看真實的條數。
一看 大概是 6千條 對 1萬多條。 那沒得說的, 直接用 hint 修改執行計劃, 果真走了hash . 那好試着跑一下唄。
結果 大振人心, 30S 結果出來了, ( 思路是先找出 rowid 再修改數據 ) , 看了一下 發現 條件 大坑啊 unreach !=1 沒有!!!!
也就是找的時間+ 回滾段的時間 而且還沒有意義, 所以加上條件後 變成了 1S 了...