【问题标题】:MDX query running slow, but only in certain arrangementMDX 查询运行缓慢,但仅在某些安排下
【发布时间】:2011-12-05 22:20:02
【问题描述】:

我正在以编程方式生成以下格式的 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,查询需要一秒钟。如果我取消注释维度 4 查询需要 40 秒。如果我取消注释维度 5 行,查询需要 8 分钟。

维度通过 ID 字段 (int) 连接到度量

维度有 238 个值

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

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

查询需要亚秒。这是关于具有尺寸组合(顶部)的东西,这使得它变得如此缓慢。不知道如何解决它。

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

【问题讨论】:

    标签: reporting-services ssas mdx cube


    【解决方案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 分钟。我可以通过在我的多维数据集定义中添加适当的聚合来进一步加快速度。但还没有到那部分。

    【讨论】:

      【解决方案2】:

      你可以试试这个版本吗? :

       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]前面的-号是错误的吗?

      它使交叉连接变得更小,并将单个值放入元组中。很好的问题,如果这能提高性能。

      【讨论】:

      • 符号 - 表示应该排除这些值。 (有点像 sql 中的“not in”)
      • 对我来说是新手。 'All' 是所有级别的层次结构 [Dimension5](包括 [All] 成员)的所有值吗?
      • 仍在试图弄清楚你在那里做了什么 :) .. 所以基本上你将所有其他维度添加到最终集合中?因为我的示例被简化了.. 我有大约 10-20 行以 *.. 开头。我只是将其缩小到那个对时间产生巨大影响的维度
      • 不,我在度量元组中包含了使用单个成员定义的所有维度。这不仅会使交叉连接变得更容易,而且对度量的评估也更容易(您已经知道自己在子立方体中进行求和)。
      • 好的,我尝试了这种方法,当我在底部集合中添加维度时,查询需要的时间越来越长......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多