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

Calculated measure in SSAS Cube either very slow or doesn't have all functionality

我有一个 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 秒内对相同数量的数据执行相同的 Pivot table)

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

问题:

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

你的表现障碍在这里:

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