Sql server MDX查询速度非常慢,在SSRS中返回内存异常
我正试图从以下多维表达式(MDX)查询中获取总金额超过100k的所有记录的详细列表:Sql server MDX查询速度非常慢,在SSRS中返回内存异常,sql-server,ssrs-2008,ssas,mdx,Sql Server,Ssrs 2008,Ssas,Mdx,我正试图从以下多维表达式(MDX)查询中获取总金额超过100k的所有记录的详细列表: 尽管我通过创建存储过程获得了快速的结果,并且最终结果少于1000行,但我的MDX查询在SSMS中永远运行,在SSRS中返回内存异常。有没有关于如何优化或增强它的想法 您可以使用Having而不是Filter,因为它是在非空之后应用的,您可能会获得更好的性能(请参见Chris Webb)。这将是查询的新版本: with member [measures].[total] as [Measures].[m1] +
尽管我通过创建存储过程获得了快速的结果,并且最终结果少于1000行,但我的MDX查询在SSMS中永远运行,在SSRS中返回内存异常。有没有关于如何优化或增强它的想法 您可以使用
Having
而不是Filter
,因为它是在非空
之后应用的,您可能会获得更好的性能(请参见Chris Webb)。这将是查询的新版本:
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])
您可以使用
Having
而不是Filter
,因为它是在非空
之后应用的,您可能会获得更好的性能(请参见Chris Webb)。这将是查询的新版本:
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])
要减少内存,请按尺寸排序 而不是:
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers
使用
在封面下,SSA将内部加入dim1成员,外部加入丢失日期成员 要减少内存,请按尺寸排序 而不是:
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers
使用
在封面下,SSA将内部加入dim1成员,外部加入丢失日期成员 我建议做一些修改 首先,您真的希望在查询中返回每个维度的所有成员吗?如果它们满足过滤器中的条件,则将包括在内。此外,我还发现将where子句更改为subselect在某些情况下性能更好。您需要测试它是否会改变性能。接下来,您可以先使用非空函数,将其放入Filter函数中,从而减少正在筛选的成员数。此外,在某些情况下,使用多态运算符(*)的性能比使用交叉连接函数或创建成员的元组集差。如果轴上只有一个项目,则不需要非空on列。我将所有这些建议结合在一起,如下所示:
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])
有关非空与非空的比较,请参见以下内容:。在某些情况下,将一个非空函数放在一个过滤器函数中可能会产生性能影响,有时不会——您需要进行测试
问题可能在维度或多维数据集设计中(存储引擎问题),而不是在查询中(公式引擎问题)。您可以使用以下技术进行诊断:。白皮书是为SSAS 2005编写的,但仍然适用于SSAS的更高版本。我建议进行一些更改 首先,您真的希望在查询中返回每个维度的所有成员吗?如果它们满足过滤器中的条件,则将包括在内。此外,我还发现将where子句更改为subselect在某些情况下性能更好。您需要测试它是否会改变性能。接下来,您可以先使用非空函数,将其放入Filter函数中,从而减少正在筛选的成员数。此外,在某些情况下,使用多态运算符(*)的性能比使用交叉连接函数或创建成员的元组集差。如果轴上只有一个项目,则不需要非空on列。我将所有这些建议结合在一起,如下所示:
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])
有关非空与非空的比较,请参见以下内容:。在某些情况下,将一个非空函数放在一个过滤器函数中可能会产生性能影响,有时不会——您需要进行测试
问题可能在维度或多维数据集设计中(存储引擎问题),而不是在查询中(公式引擎问题)。您可以使用以下技术进行诊断:。白皮书是为SSAS 2005编写的,但仍然适用于更高版本的SSAS。存储过程的作用与MDX查询相同?是的。我必须创建存储过程,它可以工作,但要求是从立方体中创建报告存储过程的功能与MDX查询相同?是的,Robert。我必须创建存储过程,它可以工作,但要求是从cubeThanks Santiii创建报告,我将此与Meff的答案结合起来,结果是15秒!谢谢Santiii,我把这个和Meff的答案结合起来,结果是15秒!谢谢Stacia的回答。实际上,我认为空值是我的问题。使用have代替filter解决了这个问题。我还检查了你的解决方案。过滤器内部的非空也起到了作用。谢谢Stacia的回答。实际上,我认为空值是我的问题。使用have代替filter解决了这个问题。我还检查了你的解决方案。过滤器内部的非空也起到了作用。改变顺序真的重要吗?我是一个mdx新手。改变顺序真的重要吗?我是mdx的新手。