【问题标题】:Slow SSAS cumulative sum calculated measure慢速 SSAS 累积总和计算量度
【发布时间】:2017-11-27 19:20:54
【问题描述】:

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

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

从第一次申请的日期到当前日期,日期范围的天数必须是连续的。

Date 维度包含从 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 函数以及许多其他函数来优化这一点,但都没有成功。

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

【问题讨论】:

  • 你需要使用Aggregate还是使用Sum可以?
  • Sum 在这种情况下应该可以工作。

标签: ssas mdx olap olap-cube


【解决方案1】:

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] 
      ) 
  )
)

但是

如果您将 isToday 列添加到 DimDate 而不是打扰“Today”成员,它会更有效 - 然后使用该列具有多维数据集日期维度的属性。这样你应该可以简化这个[Date].[Year - Month - Date].CurrentMember.MemberValue &gt;= [Date].[Date].[All].[Today].MemberValue

【讨论】:

  • 感谢您的建议。通过这个措施,我可以针对日期构建视觉效果,以查看每天的累计总数。如果没有带有 membervalue 的第二部分,基本上直到 2027 年的每一天的值都会重复(DimDate 包含未来 10 年的日期)。也许这应该完全是另一个问题?
  • @samb0x 好的 - 我现在明白你的问题了,我们的立方体在 DimDate 中只有昨天的日期 - 这就是我不明白的原因。现在的措施是否随着变化而迅速?您是否有权更改仓库/立方体?
  • 我已经实现了这个版本,它已经是一个很大的改进。不过,我不清楚如何构造“[Date].[Date].[All].[Today]”。我在 DimDate 中有一个新列“今天”,其中包含今天的日期,然后使用 [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Today].item(0).MemberValue 它有效好多了,但我对你的意思是如何构造 "[Date].[Date].[All].[Today]" 很感兴趣
  • @samb0x - 我的答案是两种不同的方法 - 您需要在 mdx 中构建 Today 或者我在 BUT 部分中建议的,这是您已经实现的
猜你喜欢
  • 1970-01-01
  • 2020-05-02
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多