Sql Server Analysis Servicesで消費の実行合計を計算する最も効率的な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/445299

  •  22-07-2019
  •  | 
  •  

質問

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

カーソルを使用してT-SQLで実行中の合計とスライディングウィンドウタイプの計算を計算するのが好ましいですか(Celkoのクロスジョインソリューションはご遠慮ください)、SSISでスクリプトタスクを使用する(または統合サービスでこれを行うより良い方法があります)か、Analysis ServicesでMDXを使用しますか?

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

役に立ちましたか?

解決

時間ディメンションの階層がある場合とない場合で、どこで機能するかを理解するために少し待ってください。私のデータとキューブ構造に基づいて、ここにまとめました:

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つだけが適切に実行されることです。

がんばって。

他のヒント

現在使用しているMDXは非常に遅いです。ここにあります。


Sum
(
PeriodsToDate([Date of Transaction].[Date].[(All)], [Date of Transaction].[Date].CurrentMember), [Measures].[Amount - Response]
)

キューブ集計を使用して、積算合計を実行する最も効率的な方法がわかりました。これは、以前のすべてのメンバーの合計+ sum(parent.firstsibling:parent.prev member、measure)+ sum(parent.parent.firstsibling:parent.parent.prevmember、measure)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top