Ssas 优化MDX查询
我对MDX非常陌生,我需要一些关于这个查询的帮助Ssas 优化MDX查询,ssas,mdx,olap-cube,Ssas,Mdx,Olap Cube,我对MDX非常陌生,我需要一些关于这个查询的帮助 Generate( filter( [Dim Products].[Product].[Product].members * [Dim Date].week.week.members, [Measures].[Price] ), nonempty( topcount( [Dim Price].[Price].[
Generate(
filter(
[Dim Products].[Product].[Product].members
*
[Dim Date].week.week.members,
[Measures].[Price]
),
nonempty(
topcount(
[Dim Price].[Price].[Price]
*
[Dim Products].[Product].currentmember
*
[Dim Date].week.currentmember,
1,
[Measures].[Price Count]
)
)
)
我在仪表板工具(Dundas dashboard)中使用上述集合来检索模式(重复次数最多的价格值)。它确实显示了正确的结果,但速度很慢。如果一周内有过滤器,则需要2-3秒;如果一周内没有过滤器,则需要约6-7秒(显示所有周的数据)。这是在SSMS中,但是客户端工具需要更长的时间才能获得结果集,有时会超时
在一些测试之后,事实表中的行数似乎不会影响性能,我已经大幅减少了它,但仍然保持不变。但是,一旦我减少了两个维度表中的成员数量—[Dim Price]、[Dim Products]。
最初需要20多秒才能获得结果集,但一旦我减少了成员数量,性能就提高到了6-7秒,如下所示:
Table | Rows Before | Rows After
[Dim Price] | 2400 | 620
[Dim Products] | 1080 | 101
这让我觉得在3个维度之间有一个笛卡尔积影响性能
我需要有人建议如何改进查询以提高性能。在使用非空函数之前,先尝试现有函数,如下所示:
Generate(
filter(
[Dim Products].[Product].[Product].members
*
[Dim Date].week.week.members,
[Measures].[Price] //<<<<<<<<<<SHOULD THIS NOT INCLUDE A CONDITION e.g. [Measures].[Price] > 0 ?
),
EXISTING nonempty(
topcount(
[Dim Price].[Price].[Price]
*
[Dim Products].[Product].currentmember
*
[Dim Date].week.currentmember,
1,
[Measures].[Price Count]
)
)
尝试3:
GENERATE(
FILTER(
NONEMPTY(
[Dim Products].[Product].[Product].MEMBERS
*
[Dim Date].week.week.MEMBERS
),
[Measures].[Price] > 0
),
TOPCOUNT(
NONEMPTY(
EXISTING
[Dim Price].[Price].[Price]
*
[Dim Products].[Product].currentmember
*
[Dim Date].week.currentmember,
[Measures].[Price Count]
),
1,
[Measures].[Price Count]
)
)
现有的
有时是性能的良好补充。关于MDX
性能没有硬性规定-甚至Chris Webb也说经验会有问题,但尝试其他方法是个好主意。过滤器的状况如何?第三个参数是否通常类似于[Measures].[Price]>10000
them@JoshGallagher您是否理解他在过滤器函数[Measures].[Price]
中使用的第二个参数?这是做什么的?它是否应该包括一些条件,例如[Measures].[Price]>0
?不,我不理解第二个filter参数。它应该计算为真值或假值,而不是数字值。谢谢。我试着在nonempty之前加入一个条件来过滤和添加Existing,但不幸的是,它们都没有任何区别。不知道我还能尝试什么。第一个[Dim Products].[Product].[Product].[Product]周围可能是空的。成员*[Dim Date].week.week.members
。我会添加到帖子中。仍然没有区别,对不起。我认为实际的问题在于topcount中的[Dim Price].[Price].[Price]。也许我需要确保它只获取当前产品和周的价格。不确定默认情况下是这样做,还是先在所有价格*当前产品和周之间做笛卡尔乘积,然后过滤结果。如果在不同维度的两个层次上做*,则默认情况下是笛卡尔乘积-这就是*所做的。我已经添加了另一个非空的,但现在找不到括号了@用户2849258请随意修改我的帖子-过滤器的第二个参数仍然处于下降状态,因为[Measures].[Price]
我会将其更改为适当的过滤器布尔值
GENERATE(
FILTER(
NONEMPTY(
[Dim Products].[Product].[Product].MEMBERS
*
[Dim Date].week.week.MEMBERS
),
[Measures].[Price] > 0
),
TOPCOUNT(
NONEMPTY(
EXISTING
[Dim Price].[Price].[Price]
*
[Dim Products].[Product].currentmember
*
[Dim Date].week.currentmember,
[Measures].[Price Count]
),
1,
[Measures].[Price Count]
)
)