MDX查询非常慢并且在SSRS中返回内存异常

时间:2012-08-20 22:16:02

标签: sql-server ssrs-2008 ssas mdx

我正在尝试从以下多维表达式(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中返回内存异常。有关如何优化或增强它的任何想法?

3 个答案:

答案 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成员,外部加入损失日期成员。