Ssas 优化MDX查询

Ssas 优化MDX查询,ssas,mdx,olap-cube,Ssas,Mdx,Olap Cube,我对MDX非常陌生,我需要一些关于这个查询的帮助 Generate( filter( [Dim Products].[Product].[Product].members * [Dim Date].week.week.members, [Measures].[Price] ), nonempty( topcount( [Dim Price].[Price].[

我对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)中使用上述集合来检索模式(重复次数最多的价格值)。它确实显示了正确的结果,但速度很慢。如果一周内有过滤器,则需要2-3秒;如果一周内没有过滤器,则需要约6-7秒(显示所有周的数据)。这是在SSMS中,但是客户端工具需要更长的时间才能获得结果集,有时会超时

在一些测试之后,事实表中的行数似乎不会影响性能,我已经大幅减少了它,但仍然保持不变。但是,一旦我减少了两个维度表中的成员数量—
[Dim Price]、[Dim Products]。
最初需要20多秒才能获得结果集,但一旦我减少了成员数量,性能就提高到了6-7秒,如下所示:

Table          | Rows Before | Rows After
[Dim Price]    | 2400        | 620 
[Dim Products] | 1080        | 101
这让我觉得在3个维度之间有一个笛卡尔积影响性能


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

在使用非空函数之前,先尝试现有函数,如下所示:

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] 
      )
  )
尝试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] 
  )
)

现有的
有时是性能的良好补充。关于
MDX
性能没有硬性规定-甚至Chris Webb也说经验会有问题,但尝试其他方法是个好主意。过滤器的状况如何?第三个参数是否通常类似于
[Measures].[Price]>10000
them@JoshGallagher您是否理解他在
过滤器
函数
[Measures].[Price]
中使用的第二个参数?这是做什么的?它是否应该包括一些条件,例如
[Measures].[Price]>0
?不,我不理解第二个filter参数。它应该计算为真值或假值,而不是数字值。谢谢。我试着在nonempty之前加入一个条件来过滤和添加Existing,但不幸的是,它们都没有任何区别。不知道我还能尝试什么。第一个
[Dim Products].[Product].[Product].[Product]周围可能是空的。成员*[Dim Date].week.week.members
。我会添加到帖子中。仍然没有区别,对不起。我认为实际的问题在于topcount中的[Dim Price].[Price].[Price]。也许我需要确保它只获取当前产品和周的价格。不确定默认情况下是这样做,还是先在所有价格*当前产品和周之间做笛卡尔乘积,然后过滤结果。如果在不同维度的两个层次上做*,则默认情况下是笛卡尔乘积-这就是*所做的。我已经添加了另一个非空的,但现在找不到括号了@用户2849258请随意修改我的帖子-过滤器的第二个参数仍然处于下降状态,因为
[Measures].[Price]
我会将其更改为适当的过滤器布尔值
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] 
  )
)