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,可能性是存在的,但概率很低。