最近工作有个需求,需要通过一个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优化方面的东西,自己第一次成功的优化,记录下!