我正在以编程方式生成以下格式的MDX查询:
WITH
MEMBER [Measures].[MTD] AS
SUM ({[Time].[Calendar].[Date].&[2011-11-01T00:00:00]:[Time].[Calendar].[Date].&[2011-11-30T00:00:00]
* {[Dimension1].[Dimension1].[Val1]}
* {[Dimension2].[Dimension2].[Val2]}
* {[Dimension3].[Dimension3].[Val3]}
* {{[Dimension4].[Dimension4].[XXXX],[Dimension4].[Dimension4].[DBS],[Dimension4].[Dimension4].[FD],[Dimension4].[Dimension4].[GSCFDASIA],[Dimension4].[Dimension4].[FDEM],[Dimension4].[Dimension4].[DX],[Dimension4].[Dimension4].[OSWP],[Dimension4].[Dimension4].[OOO],[Dimension4].[Dimension4].[CFD]}}
* {-{[Dimension5].[Dimension5].[SELI],[Dimension5].[Dimension5].[SELE],[Dimension5].[Dimension5].[MRDN],[Dimension5].[Dimension5].[WCSG],[Dimension5].[Dimension5].[NEWB],[Dimension5].[Dimension5].[VASS]}}
}, [Measures].[Trade Count])正如您所看到的,这是一种创建维值交集的简单方法,并且已经很好地工作了一段时间。
最近,我重写了多维数据集,从使用具有多个属性的单个维度表,改为对每个维度使用单独的表(出于处理性能的原因)。
问题是,当我同时使用Dimension4和Dimension5进行过滤时,它突然变得非常慢!如果我注释掉dimension4和5,查询将花费第二个时间..如果我取消注释Dimension4查询需要40秒..如果我取消对Dimension5行的注释,查询将花费8分钟。
通过ID字段(int)将维度连接到度量
该维度有238个值
如果我做一个简单的查询:
对MyCube中的行选择列计数,{-{Dimension5.Dimension5.SELI,Dimension5.Dimension5.SELE,Dimension5.Dimension5.MRDN,Dimension5.Dimension5.WCSG,Dimension5.Dimension5.NEWB,Dimension5.Dimension5.VASS}}
查询耗时sub秒。这是关于多个维度的组合(顶部),这使得它变得如此缓慢。不知道如何排除故障。
值得注意的是,我的多维数据集有13个分区,而我在设置分区时没有设置“分区聚合”步骤。
发布于 2011-12-23 06:04:36
经过大量的尝试和错误,我让我的查询在6分钟内处理完(从3.5小时开始)。
有两件事让我可以这样优化它:
1.在日期范围内使用月/年成员,而不是日期
之前:
SUM ({[Time].[Calendar].[Date].&[2011-11-01T00:00:00]:[Time].[Calendar].[Date].&[2011-11-30T00:00:00]之后
SUM ({[Time].[Month].&[2011-11-01T00:00:00]这是个大事件。由于OLAP将每个日期成员视为单独的实体,因此它将范围内的所有日期与所有其他筛选器进行交叉联接。在我的例子中,我想要一个完整的月份或完整的一年,所以不需要日期范围。
2.将所有公共过滤器(在所有成员中)放入公共WHERE子句中
在我的例子中,我有相当多的成员共享相同的过滤器。简单地将它们放在查询的底部,将速度又提高了40%。
最后,我的查询从4小时变成了6.5分钟。我可以通过在我的多维数据集定义中添加适当的聚合来进一步加快速度。但还没到那部分。
发布于 2011-12-06 23:56:07
你能试试这个版本吗?:
WITH
MEMBER [Measures].[MTD] AS
SUM ({[Time].[Calendar].[Date].&[2011-11-01T00:00:00]:[Time].[Calendar].[Date].&[2011-11-30T00:00:00]
* {{[Dimension4].[Dimension4].[XXXX],[Dimension4].[Dimension4].[DBS],[Dimension4].[Dimension4].[FD],[Dimension4].[Dimension4].[GSCFDASIA],[Dimension4].[Dimension4].[FDEM],[Dimension4].[Dimension4].[DX],[Dimension4].[Dimension4].[OSWP],[Dimension4].[Dimension4].[OOO],[Dimension4].[Dimension4].[CFD]}}
* {-{[Dimension5].[Dimension5].[SELI],[Dimension5].[Dimension5].[SELE],[Dimension5].[Dimension5].[MRDN],[Dimension5].[Dimension5].[WCSG],[Dimension5].[Dimension5].[NEWB],[Dimension5].[Dimension5].[VASS]}}
}, ([Measures].[Trade Count],[Dimension1].[Dimension1].[Val1],[Dimension2].[Dimension2].[Val2],[Dimension3].[Dimension3].[Val3]) )Dimension5前面的-是个错误吗?
它使交叉连接变得更小,并将单个值放入元组中。如果这能提高性能,那就是好问题。
https://stackoverflow.com/questions/8392723
复制相似问题