我正在尝试从以下多维表达式(MDX)查询中获取我的总金额超过100k的所有记录的详细列表:
with member [measures].[total] as
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select non empty
[measures].[total] on columns,
non empty filter ([dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers
, [measures].[total]>100000 and [Measures].[Open File Count]>0) on rows
from [Monthly Summary]
where ([1 Date - Month End].[Month End Date].[Month].&[20120331])
虽然我通过创建存储过程获得了快速结果,并且最终结果少于1000行,但我的MDX查询在SSMS中始终运行,并且在SSRS中返回内存异常。有关如何优化或增强它的任何想法?
答案 0 :(得分:2)
您可以使用Having
代替Filter
,因为它会在Non Empty
之后应用,您可能会获得更好的效果(请参阅Chris Webb的this excellent blog post)。这将是查询的新版本:
with member [measures].[total] as
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select non empty
[measures].[total] on columns,
non empty
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers
having [measures].[total]>100000 and [Measures].[Open File Count]>0 on rows
from [Monthly Summary]
where ([1 Date - Month End].[Month End Date].[Month].&[20120331])
答案 1 :(得分:2)
我会建议一些改变。
首先,您是否真的希望在查询中返回每个维度的所有成员?如果它们满足过滤器中的条件,它们将被包括在内。此外,我发现将where子句更改为subselect以在某些情况下更好地执行。您需要测试它是否会改变性能。接下来,您可以首先使用NonEmpty函数减少要过滤的成员数,方法是将其放在Filter函数中。此外,在某些情况下,使用多态运算符(*)比使用CrossJoin函数或创建成员的元组集更糟糕。如果轴上只有一个项目,则不需要NON EMPTY列。我将以下所有这些建议结合起来:
with member [measures].[total] as
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select
[measures].[total] on columns,
filter (
nonempty(
([dim1].[h1].[h1].members,
[dim1].[h2].[h2].members,
[Loss Date].[Date].[Year].members,
[Dim1].[h3].[h3].members)
, [measures].[m1]),
, [measures].[total]>100000 and [Measures].[Open File Count]>0) on rows
from
(select [1 Date - Month End].[Month End Date].[Month].&[20120331] on columns
from [Monthly Summary])
有关NON EMPTY与NonEmpty的一些解释,请参阅此内容:http://blogs.msdn.com/b/karang/archive/2011/11/16/mdx-nonempty-v-s-nonempty.aspx。在某些情况下,在Filter函数中放置一个NonEmpty函数会产生性能损失,有时候不会 - 你需要测试。
问题可能出在维度或多维数据集设计(存储引擎问题)而不是查询(公式引擎问题)中。您可以使用以下技术进行诊断:http://www.microsoft.com/en-us/download/details.aspx?id=661。白皮书是为SSAS 2005编写的,但仍适用于SSAS的更高版本。
答案 2 :(得分:1)
要减少记忆,请订购尺寸。
而不是:
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers
使用
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Dim1].[h3].allmembers
* [Loss Date].[Date].[Year].allmembers
在封面下,SSAS将内部加入dim1成员,外部加入损失日期成员。