Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssas MDX查询IIF与案例性能_Ssas_Mdx_Ssas 2008_Ssas 2012 - Fatal编程技术网

Ssas MDX查询IIF与案例性能

Ssas MDX查询IIF与案例性能,ssas,mdx,ssas-2008,ssas-2012,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]

我有这种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
        )
      )
    ) 
一些建议:

IIF
总是比
mdx中的
CASE
快得多

IIF
带有
NULL
作为其分支之一是快速的

DIVIDE
很可能比操作符
/

您的度量很复杂-您希望它运行得很快吗

你能把它分解成几个指标吗?

一些建议:

IIF
总是比
mdx中的
CASE
快得多

IIF
带有
NULL
作为其分支之一是快速的

DIVIDE
很可能比操作符
/

您的度量很复杂-您希望它运行得很快吗


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

除了为什么回答:

  • 看起来大多数检查都与确定某些成员的当前级别或特定计算有关。 因此,尝试使用范围
  • 例如

    范围([Date].[MonthQtrYr].[].成员,[Measures].[test]);
    这=;
    终端范围;
    范围([TRegrets].[Reflections].&[With Reflections],[Measures].[test]);
    这=([TRegrets].[Reflections].[Not Applieve],[Measures].[1人]);
    终端范围;
    
  • 请尽量不要使用后期绑定,如
    strtomber()
    。他们将服务器切换到逐单元慢速模式
  • 要计算上一季度、本月、最长年份,请尝试使用MDX函数:
    滞后、提前期、平行期、父项、最后一个子项

  • 将计算出的度量值用于重复条件
    [Measures].[1员工人数]>0和[Measures].[1员工人数]>0
    ,并在计算中进一步使用此度量值
  • 我知道这可能非常困难,但主要目标是让服务器使用它喜欢的东西进行操作:稀疏数据集。而不是复杂的计算

    更新:(计算示例,而不是
    strotmember

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

    年>季度>月>日
    报告日期
    维度的层次结构示例:

    Max Year计算为最大值为
    Count
    measure的年份(注释中的未过滤结果):

    下一个是当前月份的(带yyyyymm键),如果您正好需要这个月,而不需要动态:

    对于动态计算,可以使用
    PrevMember
    ParallelPeriod

    我还不知道
    [Measures].[PrevQtr]
    用法的一般概念。看起来是本季度,是吗


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

    除了whytheq回答:

  • 看起来大多数检查都与确定某些成员的当前级别或特定计算有关。 因此,尝试使用范围
  • 例如

    范围([Date].[MonthQtrYr].[].成员,[Measures].[test]);
    这=;
    终端范围;
    范围([TRegrets].[Reflections].&[With Reflections],[Measures].[test]);
    这=([TRegrets].[Reflections].[Not Applieve],[Measures].[1人]);
    终端范围;
    
  • 请尽量不要使用后期绑定,如
    strtomber()
    。他们将服务器切换到逐单元慢速模式
  • 要计算上一季度、本月、最长年份,请尝试使用MDX函数:
    滞后、提前期、平行期、父项、最后一个子项

  • 将计算出的度量值用于重复条件
    [Measures].[1员工人数]>0和[Measures].[1员工人数]>0
    ,并在计算中进一步使用此度量值
  • 我知道这可能非常困难,但主要目标是让服务器使用它喜欢的东西进行操作:稀疏数据集。而不是复杂的计算

    更新:(计算示例,而不是
    strotmember

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

    年>季度>月>日
    报告日期
    维度的层次结构示例:

    Max Year计算为最大值为
    Count
    measure的年份(注释中的未过滤结果):

    下一个是当前月份的(带yyyyymm键),如果您正好需要这个月,而不需要动态:

    对于动态计算,可以使用
    PrevMember
    ParallelPeriod

    我还不知道
    [Measures].[PrevQtr]
    用法的一般概念。看起来是本季度,是吗


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

    同意。分解复杂度量之后,最显著的改进是可能的。因为内存消耗和缓存中间结果。感谢您的回复。。是的,我可以分解,但不确定,因为我可能需要再次检查条件,不是吗?@Naveej多维数据集的日期维度中是否有未来的日期,或者日期维度中的最后一个日期是今天?在我们的立方体中是后者。分解复杂度量之后,最显著的改进是可能的。因为内存消耗和缓存中间结果。感谢您的回复。。是的,我可以分解,但不确定,因为我可能需要再次检查条件,不是吗?@Naveej多维数据集的日期维度中是否有未来的日期,或者日期维度中的最后一个日期是今天?在我们的立方体中是后者。谢谢Alex…将尝试使用范围。我怎样才能做到这一点
    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;