SSAS Cube 中的计算度量要么非常慢,要么不具备所有功能

Posted

技术标签:

【中文标题】SSAS Cube 中的计算度量要么非常慢,要么不具备所有功能【英文标题】:Calculated measure in SSAS Cube either very slow or doesn't have all functionality 【发布时间】:2017-09-01 07:18:21 【问题描述】:

我有一个 SSAS 多维数据集,其中包含许多用 MDX 编写的计算度量。

一个特定的问题给我带来了麻烦 - 运行总计。

计算度量的目的

计算的度量值应汇总来自 B.O.T. 的所有移动。直到最后一刻, 意思是当因为我们已经到达现在而没有更多的运动时,那么应该重复该值,直到我的时间维度中没有更多的日期。 示例:

FY13  0.00
FY14  10.00
FY15  13.00
FY16  14.00
FY17  20.00
FY18  20.00
FY19  20.00
FY20  20.00
FY21  20.00

此外,该措施应该适用于我所有的日期层次结构(有四个)。 实际上,我使用以下代码使其按预期工作:

CREATE MEMBER CURRENTCUBE.[Measures].[Actual Balance LCY]
AS AGGREGATE(
  NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember
   * NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember
   * NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember
  * NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember
,[Measures].[Actual LCY]
), 
FORMAT_STRING = "#,##0.00;-#,##0.00", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Actual'; 

问题:

当度量添加到 Excel 中的数据透视表时,例如行上添加了两个维度,列上添加了一个日期层次结构,查询变得非常慢。 40-60 秒(我知道这很慢,因为我们在 timeXtender 中构建了一个遗留的多维数据集,它在 5-10 秒内对相同数量的数据执行相同的数据透视表)

我在 MDX 中添加了NON_EMPTY。然后查询很快,但在 FY17 之后没有更多值,这不是预期的行为。 在旧版解决方案中,NON_EMPTY 也没有输入,但它仍然更快。

问题:

如何做才能获得度量的预期行为和合理的查询速度?

【问题讨论】:

[Measures].[Actual LCY] 是否需要Aggregate?可以换成Sum吗? 应该可以。我不是 MDX 专家 【参考方案1】:

你的性能障碍在这里:

NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember
* NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember
* NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember
* NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember

这个交叉连接操作实在是太繁重了。 我会使用两种方法。选择你更喜欢的:

1:取决于您选择的层次结构,您会得到结果(无需交叉连接所有内容)。

Aggregate(
   case 
      when not [Posting Date].[Calendar Year Y-Q-M-D].CurrentMember is [Posting Date].[Calendar Year Y-Q-M-D].DefaultMember 
      then NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember
      when not [Posting Date].[Calendar Year Y-M-D].CurrentMember is [Posting Date].[Calendar Year Y-M-D].DefaultMember 
      then NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember
      when not [Posting Date].[Fiscal Year Y-M-D].CurrentMember is [Posting Date].[Fiscal Year Y-M-D].DefaultMember 
      then NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember
      when not [Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember is [Posting Date].[Fiscal Year Y-Q-M-D].DefaultMember 
      then NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember
      else NULL
   end,
   [Measures].[Actual LCY]
)

2:添加最大天数度量(因此它知道当前成员的最后一天(与层次结构无关):

Aggregate(
   NULL:StrToMember('[Posting Date].[Day].[' + cint([Measures].[Max Day]) + ']')
   [Measures].[Actual LCY]
)

【讨论】:

非常感谢。它将刷新时间从 4 多分钟缩短到大约 1-2 分钟,这更容易接受。我想如果不使用非空就没有任何方法可以快速实现它? 是的,在 SSAS 中滚动测量的快速而可靠的方法是痛苦的。它错过了 >= 关系。尽管如此,您可以准备一个包含滚动逻辑和 LastChild 聚合的度量表。您也可以在 Where 子句中使用 NULL:[Posting Date].[Calendar Year Y-Q-M-D].[20170101] 设置硬编码报告。 不幸的是,制作这些报告的人的需求变化很大。但不是很精通技术,所以越动态越好;) 创建度量表?像普通的事实表一样?听起来是个好主意,但我认为 SSAS 特别适合这些类型的计算——这难道不是使用立方体的力量之一吗? 是和不是。 MDX 对于这种计算非常灵活。但是您可能会损害性能和过滤器的完整性(这意味着您必须了解计算在不同层次结构上的行为方式)。关于度量表,我的意思是使用 LastChild 聚合计算每个时间段的滚动值,例如 Day1 ValueDay1、Day2 ValueDay1+ValueDay2 等。

以上是关于SSAS Cube 中的计算度量要么非常慢,要么不具备所有功能的主要内容,如果未能解决你的问题,请参考以下文章

SSAS OLAP Cube - Sum 度量仅在存在键时有效

PY YTD 计算的可以处理闰年 MDX 的度量

使用 where 子句 (MDX) 的 SSAS 计算度量

SSAS MDX 计算度量 - [ITEMS] 的 COUNT 个。[Item] 分组 [Items].[Item Group]

SSAS 计算成员中的 MDX 查询

SSAS 中的事实测量安全性