Sql 在Oracle中无需连接即可提高性能
我有三张桌子Sql 在Oracle中无需连接即可提高性能,sql,oracle10g,Sql,Oracle10g,我有三张桌子 - Tab_active(Contains active details )(Contains 30 million records) - Tab_apr(Contains customer details for april) (contains 7 lakh records) - Tab_may(Contains customer details for may) (contains 7 lakh records) - Tab_jun(Contains
- Tab_active(Contains active details )(Contains 30 million records)
- Tab_apr(Contains customer details for april) (contains 7 lakh
records)
- Tab_may(Contains customer details for may) (contains 7 lakh
records)
- Tab_jun(Contains customer details for june) (contains 7 lakh
records)
所有表的表结构都相同
CustNo Revenue
1000 54.55
现在我写一个程序来计算
[(Revenue for June)/(Avg Revenue for Apr,May)-1]
为此,我需要3个月(6月、4月和5月)的活跃人员以及Tab_活跃人员
考虑到活动客户记录的大小,使用联接将降低性能。
有更好的方法吗
提前感谢。我可以想出一种不用加入的方法,但我不能保证它会更快:
select sum(revJun) / (sum(RevMay)*0.5 + sum(RevApr)*0.5 - 1)
from (select CustNo, sum(revJun) as revJun, sum(revMay) as revMay, sum(revApr) as revApr,
count(*) as NumActiveMonths
from ((select Custno, Revenue, 'Now' as which, 0.0 as RevJun, 0.0 as RevMay, 0.0 as RevApr
from tab_active
) union all
(select Custno, Revenue, 'Jun', Revenue as RevJun, 0.0 as RevMay, 0.0 as RevApr
from tab_Jun
) union all
(select Custno, Revenue, 'May', 0.0 as RevJun, Revenue as RevMay, 0.0 as RevApr
from tab_May
) union all
(select Custno, Revenue, 'Apr', 0.0 as RevJun, 0.0 as RevMay, Revenue as RevApr
from tab_Apr
)
) t
group by CustNo
) t
where NumActiveMonths = 4
我不知道这会更快。你必须进行实验。我不确定自己是否理解“以及那些活跃的人”的意思。这是否意味着您希望为
tab\u active
中的每个客户返回一行,即使这些客户在其他三个表中都不存在?如果是,您希望使用什么逻辑?如果6月份没有收入,程序是否应返回0?还是NULL
?如果缺少4月或5月的收入,那么是否应忽略缺少的月份,或者是否应假定其值为0?很抱歉造成混淆。我的意思是,我希望所有三个表中都有客户的记录。为什么(您认为)联接会降低性能?因此,如果客户出现在所有四个表中,您只希望返回一行?客户是否可能出现在tab\u apr
、tab\u may
和tab\u jun
表中,而不同时出现在tab\u active
表中?Ya Justin,可能性是存在的,但概率很低。