0

私は3つのテーブルを持っています。

 - 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_activeにいる人が必要です。

アクティブな顧客レコードのサイズを考慮すると、結合を使用するとパフォーマンスが低下します。これを行うためのより良い方法はありますか?

前もって感謝します。

4

1 に答える 1

1

参加せずにこれを行う1つの方法を考えることはできますが、それがより速くなることを保証することはできません。

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

これが速くなるかどうかはわかりません。実験する必要があります。

于 2012-07-30T12:20:24.727 に答える