最近工作有個需求,需要通過一個SQL實作。
當時的邏輯是
with a as(
select * from a
),
b as (
select * from b
),
c as (
select * from c
)
select a.a,sum(case ..) from a
join b on a.id=b.id and b.cn>10
join c on a.id=c.id
group by a.a
整個SQL執行完大概花了15分鐘,由于SQl需要放線上上系統的,這個時間是完全不行的。
于是隻能下手優化。
先是把with裡的a,b,c中能聚合的都聚合,聚合之後,在後面進行計算,
執行下來,時間還是比較久。
後續看了下執行計劃,貌似太多的nest loop,然後腦洞開了一下。把b的條件加到a裡,直接把資料量級由幾萬限定到幾千,
再完成後續的處理。
修改完,執行時間隻需要10秒。之前很少涉及oracle優化方面的東西,自己第一次成功的優化,記錄下!