MDX查询运行缓慢,但只能在一定的安排

时间:2011-12-05 22:20:02

标签: reporting-services ssas mdx cube

我正在以下列格式以编程方式生成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时,它突然变得非常慢!如果我注释掉维度4和5,则查询需要一秒钟...如果我取消注释Dimension4查询需要40秒..如果我然后取消注释Dimension5行,则查询需要8分钟。

维度通过ID字段(int)

连接到度量

维度有238个值

如果我做一个简单的查询:

选择列数,{ - {[Dimension5]。[Dimension5]。[SELI],[Dimension5]。[Dimension5]。[SELE],[Dimension5]。[Dimension5]。[MRDN],[Dimension5] 。[Dimension5]。[WCSG],[Dimension5]。[Dimension5]。[NEWB],[Dimension5]。[Dimension5]。[VASS]}}来自MyCube的行

查询需要亚秒级。这是一个关于维度(顶部)的组合使得它如此痛苦地缓慢。不知道如何解决它。

可能值得注意的是,我的多维数据集有13个分区,我在设置分区时没有设置“分区聚合”步骤。

2 个答案:

答案 0 :(得分:1)

经过大量的反复试验后,我的查询在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分钟。我可以通过在我的多维数据集定义中添加适当的聚合来进一步加快速度。但还没到达那个部分。

答案 1 :(得分:0)

你能试试这个版本吗? :

 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]之前的签到这是一个错误吗?

它使交叉连接变得更小,并在元组中放置单个值。如果能提高性能,那就是好问题。