2017-04-07 5 views
0

UserGroupsディメンションが複数の階層で構成されるSSASマルチディメンションキューブで作業しています。各階層は、ユーザーを特定のグループに属するものとして分類します。ユーザーは複数のグループに所属できます。共有ディメンションの階層ごとに1行の高速MDXクエリ

ディメンションの階層ごとに1つの行を含むテーブルを生成しようとしています。

WITH 

    MEMBER [Measures].[Group Name] AS 
     CASE 
      WHEN [UserGroups].[Group A].CurrentMember.MemberValue <> 'All' THEN "Group A" 
      WHEN [UserGroups].[Group B].CurrentMember.MemberValue <> 'All' THEN "Group B" 
      -- More user groups... 
      WHEN [UserGroups].[Group T].CurrentMember.MemberValue <> 'All' THEN "Group T" 
      ELSE "Error" 
     END 
SELECT 

{[Members].[Group Name], [Measures].[User Count], [Measures].[Revenue]} ON 0, 

Order(
    UNION(
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 


     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 

     -- A bunch more blocks so that there is one for each row. 

     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
    ), 
) 
ON 1 

FROM [Finances]; 
これは予想されるテーブルを生成することに成功し

    Group Name User Count Revenue 
All All ... True Group T  90   1800 
... ... ... ... ...   ...   ... 
All True ... All Group B  20   400 
True All ... All Group A  10   100 

しかし、クエリが非常に遅いです、私が出ている最善のアプローチは、次のようです。任意の行は、約30秒で孤立して計算できます。 UNIONステートメントを使用して行を結合すると、追加の行が1つ増えるたびに、計算時間が意図的に増加するのではなく、計算時間が指数関数的に増加するように見えます。

  • この増加時間はなぜ観測されますか?
  • 基本となるエンジンに各行を単独で計算させる方法はありますか?
  • このクエリを発行するための簡単な方法はありますか?
+0

これは驚くべきことですが、各行は非常に遅いです。ユーザーカウントは通常のSUM指標ですか?ファクトテーブルは何行ですか?グループAによるユーザーカウントの単純なクエリを実行しただけの場合、その1つのセルを取得するのにどれくらい時間がかかりますか?収益はどうですか?質問に含まれるもの以外に、他の計算方法がありますか? – GregGalloway

+0

キューブを変更する緯度はありますか?多対多のUserGroupディメンションは理にかなっています。それがオプションかどうか私に教えてください。 – GregGalloway

答えて

0

私はあなたがすでにSELECTからUNION(...)を取り出してWITH句の名前付きSETにすると、そのヘルプを再配置することを実験したと思いますか?

WITH 
    SET [RowSet] AS 
     UNION(
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 


     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 

     -- A bunch more blocks so that there is one for each row. 

     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
    ) 
    MEMBER [Measures].[Group Name] AS 
     CASE 
      WHEN [UserGroups].[Group A].CurrentMember.MemberValue <> 'All' THEN "Group A" 
      WHEN [UserGroups].[Group B].CurrentMember.MemberValue <> 'All' THEN "Group B" 
      -- More user groups... 
      WHEN [UserGroups].[Group T].CurrentMember.MemberValue <> 'All' THEN "Group T" 
      ELSE "Error" 
     END 
SELECT 

    {[Members].[Group Name], [Measures].[User Count], [Measures].[Revenue]} ON 0, 

    Order(
    [RowSet], 
) 
ON 1 
FROM [Finances]; 

ORDER関数の目的は何ですか?あなたが注文しているものが見えませんか?再び

暗闇の中でだけでショットが、私は時々私はUNIONを使用して+演算子を使用して間の効率の違いに気づいたと思う - ので、別のオプション:私はdefinitesありません

WITH 
    SET [RowSet] AS 
     { 
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]} 
     } 
     + 
     { 
     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]} 
     } 

     -- A bunch more blocks so that there is one for each row. 
     + 
     { 
     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
     } 
    MEMBER [Measures].[Group Name] AS 
     ... 
     ... 

謝罪を - 上記は幸運になるかもしれないオプションです!グレッグとできるだけ詳しく話し合いましょう。彼はキューブデザインの可能な修正についてあなたに助言を与えることができます。

関連する問題