我有一个代表活跃客户的计算成员。那将是以下内容;
WITH MEMBER [Measures].[Active Customers] AS
Count ( nonempty( Filter (
( [Customer].[Customer Key].Members, [Measures].[Turnover] ),
[Measures].[Turnover] > 0
) ) )
这非常有用,当我想在当前时期和之前的时间内获得活跃客户时,我得到我的时间维度,并使用具有延迟功能的CurrentMember,CurrentMember.PrevMember和CurrentMember,以便获得客户在以前的时期活跃。
我的问题是,当我想得到不同成员中常见的客户数量时。假设我希望获得当前期间活跃的客户,而不是上一期间的客户。或者另一种情况,在当前活动,在以前活动。因此,我需要使用 INTERSECT 功能,我的客户维度有400万条记录。这已经是900万条记录的子集。
因此,在检查连续2个时段处于活动状态的客户时,我这样做(活动上一个时段,活动当前时段基本上是上面的计算成员,但 CurrentMember 和 CurrentMember.PrevMember ):
set [Previous Active Customers Set] AS
Filter (
( [Customer].[Customer Key].Members, [Measures].[Active Previous Period] ),
[Measures].[Active Previous Period] > 0
)
set [Current Active Customers Set] AS
Filter (
( [Customer].[Customer Key].Members, [Measures].[Active Current Period] ),
[Measures].[Active Current Period] > 0
)
member [Measures].[Active 2 consecutive periods] as
count(INTERSECT([Current Active Customers Set],[Previous Active Customers Set]) )
这需要永远。 无论如何要改进,或解决使用INTERSECT和大型套装的性能问题?或者可能对MDX查询进行了优化?我总是尝试使用我的客户维度的子集,但这只会将记录数量减少到不到400万 - 所以它仍然很大。任何帮助将不胜感激!
答案 0 :(得分:2)
如果您尽量避免使用命名集和计算成员,我认为您可以加快速度。
这样做的一个步骤如下:创建一个新的事实表,其中只有您的客户和时间维度使用外键,如果客户当天处于活动状态,则向其添加记录。建立一个衡量小组,让我们说" activeCustomers"基于此表,只需使用" count"作为衡量标准。但是让它变得不可见,因为我们不需要它。
然后,您可以替换
count( nonempty( Filter (
( [Customer].[Customer Key].Members, [Measures].[Turnover] ),
[Measures].[Turnover] > 0
) ) )
与
count( Exists(
[Customer].[Customer Key].Members,
<state your time selection here>,
"activeCustomers"
) )
Exists
应该比Filter
更有效。
另一种优化方法可能是观察到,不是交叉通过Filter生成的两个集合,而是可以定义一个具有更复杂过滤器的集合,避免AS沿着客户循环两次,然后交叉结果:
set [Active Customers Set] AS
Filter (
( [Customer].[Customer Key].Members, [Measures].[Active Previous Period] ),
[Measures].[Active Previous Period] > 0
AND
[Measures].[Active Current Period] > 0
)