3

SSAS 2005 に、何百万ものレコードの累計を計算するキューブがあります。現在の実装では、MDX で PeriodsToDate sum 関数を使用していますが、非常に遅く、場合によっては結果を返すのに 15 分以上かかります。この問題には膨大な数の解決策があるので、他の誰かがすでにこれらのいくつかをテストしており、それぞれの実装とテストの時間を節約できることを願っています.

カーソルを使用して T-SQL で実行中の合計とスライディング ウィンドウ タイプの計算を計算することをお勧めします (Celko のクロス結合ソリューションは使用しないでください。紙の上では見栄えが良いことはわかっていますが、クロス結合ソリューションはデータが大きくなるにつれて非常に遅くなります)。 SSIS のスクリプト タスク (または、統合サービスでこれを行うためのより良い方法はありますか) または Analysis Services で MDX を使用しますか?

他のアイデアはありますか?

4

3 に答える 3

7

時間次元の階層がある場合とない場合で、これがどこで機能するかを理解するのに少し時間がかかりました。私のデータと私のキューブ構造に基づいて、ここに私がまとめたものがあります:

with member [Measures].[RunningTotal] as 
'sum({[Deferred Revenue Date].[Standard Calendar].CurrentMember.Level.Item(0):[Deferred Revenue Date].[Standard Calendar].CurrentMember}, [Measures].[Deferred Revenue Amount])'
select
    {[Measures].[Deferred Revenue Amount]
    ,[Measures].[RunningTotal]
    } on columns,
    nonempty([Deferred Revenue Date].[Standard Calendar].[Date], [Measures].[Deferred Revenue Amount]) on rows
from
DW;

トリックの 1 つは、ディメンションおよびメジャーとの共通部分がある場合にのみ、計算されたメジャー列に値を返す nonempty() 句です。これがないと、メジャー列に一連の NULL が表示され、計算されたメジャー列に多数の繰り返し値が表示されます。これは実際には非常に便利なクエリです。

計算されるメンバーは、SELECT ステートメントで指定したレベル (日付、月、または年) に関係なく機能します。私の場合、あなたがやろうとしていたことにできるだけ近づけるために日付を試しました. あなたのキューブに似たようなクエリを書いたところ、43 秒で実行されました。この新しいものは約 2 秒で実行され、かなりの量のデータがあるため、アグリゲーションが構築されていると仮定すると、はるかに高速に実行されるはずです。

MDX の問題は、何かを実行する方法が 18 通りもあるのに、うまく動作するのは 1 つか 2 つだけだということです。

幸運を。

于 2009-01-16T22:57:26.647 に答える
0

私が現在使用している MDX は非常に遅いです。


Sum
(
PeriodsToDate([Date of Transaction].[Date].[(All)], [Date of Transaction].[Date].CurrentMember), [Measures].[Amount - Response]
)
于 2009-01-15T21:37:40.340 に答える
0

累計を計算する最も効率的な方法は、キューブ集計を利用することであることがわかりました。アイデアは、以前のすべてのメンバーの合計 + sum(parent.firstsibling:parent.prev member,measure)+ sum(parent.parent.firstsibling:parent.parent.prevmember,measure) を取得することです

于 2014-03-12T17:36:13.563 に答える