优化MDX查询

时间:2014-05-19 11:21:39

标签: ssas mdx olap-cube

我是MDX的新手,我需要一些关于此查询的帮助。

Generate( 
    filter( 
      [Dim Products].[Product].[Product].members 
        * 
      [Dim Date].week.week.members, 
      [Measures].[Price] 
      ), 
      nonempty( 
        topcount( 
          [Dim Price].[Price].[Price] 
            *
          [Dim Products].[Product].currentmember 
            * 
          [Dim Date].week.currentmember, 
          1, 
          [Measures].[Price Count] 
          )
      )
   ) 

我在仪表板工具(Dundas Dashboard)中使用上述命名集以检索MODE(重复次数最多的价格值)。它确实显示正确的结果,但它很慢。如果一周有过滤器则需要2-3秒,如果一周没有过滤器则需要大约6-7秒(显示所有周的数据)。这是在SSMS中,但客户端工具需要更长时间才能获得结果集,有时会超时。

经过一些测试后,事实表中的行数似乎不会影响性能,我已经大幅减少但仍然相同。然而,一旦我减少了2个维度表中的成员数量,性能就会提高 - [Dim Price], [Dim Products].最初,它需要20秒以上才能获得结果集,但是一旦我#&#改进到6-7秒39; ve减少了成员数量如下:

Table          | Rows Before | Rows After
[Dim Price]    | 2400        | 620 
[Dim Products] | 1080        | 101

这让我觉得3个维度之间存在影响性能的笛卡尔积。

我需要有人建议我如何改进查询以提高性能。

1 个答案:

答案 0 :(得分:0)

在NONEMPTY函数之前尝试EXISTING函数,如下所示:

Generate( 
filter( 
  [Dim Products].[Product].[Product].members 
    * 
  [Dim Date].week.week.members, 
  [Measures].[Price]  //<<<<<<<<<<SHOULD THIS NOT INCLUDE A CONDITION e.g. [Measures].[Price] > 0 ?
  ), 
  EXISTING nonempty( 
    topcount( 
      [Dim Price].[Price].[Price] 
        *
      [Dim Products].[Product].currentmember 
        * 
      [Dim Date].week.currentmember, 
      1, 
      [Measures].[Price Count] 
      )
  )

尝试2:

Generate( 
    filter( 
      NONEMPTY(
        [Dim Products].[Product].[Product].members 
          * 
        [Dim Date].week.week.members, 
        [Measures].[Price]  
        )
      ), 
      EXISTING nonempty( 
        topcount( 
          [Dim Price].[Price].[Price] 
            *
          [Dim Products].[Product].currentmember 
            * 
          [Dim Date].week.currentmember, 
          1, 
          [Measures].[Price Count] 
          )
      )
   )

尝试3:

GENERATE( 
  FILTER( 
    NONEMPTY(
      [Dim Products].[Product].[Product].MEMBERS 
        * 
      [Dim Date].week.week.MEMBERS
        ), 
    [Measures].[Price] > 0 
  ), 
  TOPCOUNT( 
    NONEMPTY(
            EXISTING 
            [Dim Price].[Price].[Price] 
            *
            [Dim Products].[Product].currentmember 
            * 
            [Dim Date].week.currentmember,
      [Measures].[Price Count] 
      ), 
    1, 
    [Measures].[Price Count] 
  )
)