缓慢的SSAS累计和计算度量

时间:2017-11-27 19:20:55

标签: ssas mdx olap olap-cube

我有一个度量的累积总和,结构如下:

Aggregate (
    { NULL : [Date].[Year - Month - Date].CurrentMember } 
    ,[Measures].[Applications] )

从第一次申请之日起至当前日期,日期范围的日期必须是连续的。

日期维度包含从1900-01-01到未来的日期。

我试图通过如下构建计算出的度量来消除第一次申请之前的日期和未来日期:

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
CASE 
WHEN   
    /* Eliminates dates before first applications, i.e. year 1900-01-01 */
    Aggregate (
        { NULL : [Date].[Year - Month - Date].CurrentMember } 
        ,[Measures].[Applications] ) < 0   
THEN NULL
WHEN
    /* Eliminates dates after today */
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']').MemberValue 
THEN NULL
ELSE
    Aggregate (
            { NULL : [Date].[Year - Month - Date].CurrentMember } 
            ,[Measures].[Applications] )           
END

通过使用SCOPE作为case语句的替代方法,利用EXISTS和EXCEPT函数以及许多其他函数,只在需要聚合的地方进行优化时,我没有成功。

浏览多维数据集并按[Measures].[Applications TD]用户定义的层次结构标注[Date].[Year - Month - Date]时,速度非常慢。

1 个答案:

答案 0 :(得分:2)

IIF通常比CASE快,而SUM通常比AGGREGATE快。
虽然您的主要问题是使用membervalue的条件的第二部分 - 是否需要或以下不会做同样的事情? :

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
IIF(
     SUM (
        { NULL : [Date].[Year - Month - Date].CurrentMember } 
        ,[Measures].[Applications] 
     ) < 0 
   , NULL
   , 
   SUM (
         { NULL : [Date].[Year - Month - Date].CurrentMember } 
          ,[Measures].[Applications] 
    ) 
)

我将其作为自定义成员分开:

CREATE MEMBER CURRENTCUBE.[Date].[Date].[All].[Today] AS //<< a  little of syntax for this create 
    StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']')

然后尝试嵌套IIF

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
IIF(
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue
   , NULL
   , IIF(
       SUM (
          { NULL : [Date].[Year - Month - Date].CurrentMember } 
          ,[Measures].[Applications] 
       ) < 0 
     , NULL
     , 
     SUM (
           { NULL : [Date].[Year - Month - Date].CurrentMember } 
            ,[Measures].[Applications] 
      ) 
  )
)

<强> BUT

而不是打扰&#34;今天&#34;如果将一个isToday列添加到DimDate,那么它将更有效率 - 然后使用该列具有多维数据集日期维度的属性。这样你就可以简化这个[Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue