MDX查询IIF与CASE性能

时间:2015-10-21 14:38:37

标签: ssas mdx ssas-2008 ssas-2012

我有这种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
        )
      )
    ) 

2 个答案:

答案 0 :(得分:3)

除了 whytheq 回答:

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

    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()这样的后期绑定。他们将服务器切换到慢速逐个单元模式。
    2. 要计算previous quarter, current month, max year尝试使用MDX函数:Lag, Lead, ParallelPeriod, Parent, LastChild等。

      1. 对重复条件[Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0使用计算的度量,并在计算中进一步使用此度量。
      2. 我知道这可能非常困难,但主要目标是让服务器运行它喜欢的东西:稀疏的数据集。而不是棘手的计算。

        更新(计算的例子代替StrToMember

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

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

        最高年度计算为年份,最多为Count次度(评论中未过滤的结果):

        AvoidStrToMember_1MaxYear

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

        AvoidStrToMember_2CurrMo

        对于动态计算,可以使用PrevMemberParallelPeriod

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

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

答案 1 :(得分:2)

一些建议:

IIF

中,{p> CASE几乎总是比mdx更快

IIF NULL作为其分支之一很快。

DIVIDE可能比运营商/

更快

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

你能将它分解成几种措施吗?