0

我有这种 MDX 语法,当使用多维属性进行切片时效率不高。我怎样才能提高性能?IIF 或 CASE 在这里最好选择什么?

WITH 
  MEMBER [Measures].[test] AS 
    IIF
    (
      IsLeaf([Date].[MonthQtrYr].CurrentMember) = True
     ,IIF
      (
        [Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0
       ,
        [Measures].[1 Termcount] / [Measures].[1 Headcount]
       ,null
      )
     ,IIF
      (
                [Date].[MonthQtrYr].CurrentMember IS [Date].[MonthQtrYr].[All]
              AND 
                [Date].[Month].CurrentMember IS [Date].[Month].[All]
            AND 
              [Date].[Quarter].CurrentMember IS [Date].[Quarter].[All]
          AND 
            [Date].[Week].CurrentMember IS [Date].[Week].[All]
        AND 
          [Date].[WeekbyYr].CurrentMember IS [Date].[WeekbyYr].[All]
       ,IIF
        (
          [Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0
         ,
            [Measures].[1 Termcount]
          / 
            IIF
            (
              [TRegrets].[Regrets].CurrentMember IS [TRegrets].[Regrets].&[With Regrets]
             ,(
                [TRegrets].[Regrets].&[Not Applicable]
               ,[Measures].[1 Headcount]
              )
             ,[Measures].[1 Headcount]
            )
         ,null
        )
       ,IIF
        (
              [Date].[MonthQtrYr].CurrentMember
            IS 
              StrToMember
              (
                "[Date].[MonthQtrYr].[Year].&[" + Cstr([Measures].[MaxYear]) + "]"
              )
          OR 
              [Date].[Quarter].CurrentMember
            IS 
              StrToMember
              ("[Date].[Quarter].&["
                  + 
                    StrToMember
                    (
                      "[Date].[Quarter].&[Q" + Cstr([Measures].[PrevQtr]) + "]"
                    ).NextMember.Member_Caption
                + "]"
              )
         ,StrToMember("[Date].[Month].&[" + Cstr([Measures].[CurrMo]) + "]")
         ,[Date].[MonthQtrYr].CurrentMember.LastChild
        )
      )
    ) 
4

2 回答 2

3

除了whytheq回答:

  1. 看起来大多数检查都与确定某些成员的当前级别或特定计算有关。因此,请尝试使用 SCOPE。

例如

SCOPE ([Date].[MonthQtrYr].[<LeafLevelName>].Members,[Measures].[test]);
THIS = <calculation #1>;
END SCOPE;

SCOPE ([TRegrets].[Regrets].&[With Regrets],[Measures].[test]);
THIS = ([TRegrets].[Regrets].&[Not Applicable],[Measures].[1 Headcount]);
END SCOPE;
  1. 也请尽量不要使用后期绑定,如StrToMember(). 他们将服务器切换到逐个单元的慢速模式。

要计算previous quarter, current month, max year尝试使用 MDX 函数:Lag, Lead, ParallelPeriod, Parent, LastChild等。

  1. 对重复条件使用计算度量[Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0,并在计算中进一步使用此度量。

我知道这可能非常困难,但主要目标是让服务器使用它喜欢的东西运行:sparse sets of data。而不是棘手的计算。

更新:(计算示例而不是StrToMember

不确定我理解的计算是否正确,因为您没有在提供的代码中提及它们。但这里有一些想法。

Year > Quarter > Month > Day维度层次结构示例Report Date

最大年份计算为具有最大值的年份Count(评论中未过滤的结果):

避免StrToMember_1MaxYear

接下来是当前月份(使用 YYYYMM 键),如果您需要这个月没有动态:

避免StrToMember_2CurrMo

用于动态计算PrevMemberParallelPeriod可以使用。

我还没有大致的[Measures].[PrevQtr]用法概念。看起来是当前季度,不是吗?

如果您提供有关用于此度量的每个计算的更多详细信息,我们可以尝试创建更快的代码。

于 2015-10-21T16:03:54.427 回答
2

几点建议:

IIF几乎总是比CASEin快mdx

IIFNULL作为其分支之一,速度很快。

DIVIDE可能比操作员更快/

您的措施很复杂——您希望它快速运行吗?

你能把它分解成几个度量吗?

于 2015-10-21T14:58:47.280 回答