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]
)
我有一个 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]
)