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 度量仅在存在键时有效
SSAS MDX 计算度量 - [ITEMS] 的 COUNT 个。[Item] 分组 [Items].[Item Group]