【问题标题】:SSAS Calculated Measure based on another calculated measure基于另一个计算度量的 SSAS 计算度量
【发布时间】:2016-11-11 16:58:46
【问题描述】:

我在下面有一个 MDX 查询。此查询有效,问题是它很慢,即使数据集不大,也需要 > 15 秒才能返回结果。我相信查询应该在 2 秒内执行(它也用于登录页面,等待时间很麻烦)。由于所有 IF THEN ELSE 逻辑,[Measures].[Star Rating] 导致速度变慢。它所做的一切都是基于[Mean Score],它根据查找表中的范围从查找表中找到[Star Rating]。 例如如果 [平均分] = 86 且

[平均分] 是一个简单的总和/计数计算。 它可以根据用作参数的日期范围进行更改。 您能否推荐以下现有查询中的优化或推荐另一种计算 [Star Rating] 的方法?

MDX 查询如下:

    WITH 
       MEMBER [Measures].[MeanScore] AS ([Measures].[Standard Point Assignment - Sum]/[Measures].[Episode Of Care HCAHPS Count])
       MEMBER [Measures].[StarRating] AS 
       CASE 
       WHEN [HCAHPS Star Rating].[HCAHPS Star Rating ID].CurrentMember IS [HCAHPS Star Rating].[HCAHPS Star Rating ID].[All] 
          THEN 
         CASE 
           WHEN [Measures].[HSR-HCHCAHPS Domain ID] = TAIL([HCAHPS Star Rating].[HCAHPS Star Rating ID].[HCAHPS Star Rating ID]).Item(0).Item(0).Properties('HCHCAHPS Domain ID') 
                  THEN 
               (
                [Measures].[Rating], 
                Tail([HCAHPS Star Rating].[HCAHPS Star Rating ID].[HCAHPS Star Rating ID]).Item(0).Item(0)
               )
           ELSE 
               (
                [Measures].[StarRating],
                Tail([HCAHPS Star Rating].[HCAHPS Star Rating ID].[HCAHPS Star Rating ID]).Item(0).Item(0).PrevMember
               )
         END 
       ELSE 
         CASE 
           WHEN [Measures].[MeanScore] > [HCAHPS Star Rating].[HCAHPS Star Rating ID].CurrentMember.Properties('Start', typed)
           AND [Measures].[HC-HCAHPS Domain ID] = [HCAHPS Star Rating].[HCAHPS Star Rating ID].CurrentMember.Properties('HCHCAHPS Domain ID', typed) 
                  THEN 
               (
               [Measures].[Rating], 
                [HCAHPS Star Rating].[HCAHPS Star Rating ID].CurrentMember
                )
           ELSE 
               (
                [Measures].[StarRating],
                [HCAHPS Star Rating].[HCAHPS Star Rating ID].CurrentMember.PrevMember
               ) 
         END 
     END 
SELECT 
    {
        [Measures].[Episode Of Care HCAHPS Count]
        ,[Measures].[Is Top Box]
        ,[Measures].[CompositeScore]   
        ,[Measures].[PromoterCount]
        ,[Measures].[PromoterPercent]
        ,[Measures].[PassiveCount]
        ,[Measures].[PassivePercent]
        ,[Measures].[DetractorCount]     
        ,[Measures].[DetractorPercent]
        ,[Measures].[StarRating]
        ,[Measures].[MeanScore]
    } ON COLUMNS, 
    NONEMPTYCROSSJOIN
    (
        {NONEMPTY([HCAHPS Domain].[HCAHPS Survey Methodology ID].[HCAHPS Survey Methodology ID])}
        ,DESCENDANTS(StrToSet('[Org Hierarchy].[Parent Key].&[118418]'))
        ,{[HCHCAHPS Domain].[HC Domain Group].[HC Domain Group]}
        ,{[HCHCAHPS Domain].[HCAHPS Domain Name].[HCAHPS Domain Name]}
        ,{[HCAHPS Question Answer].[Question Number].AllMembers}
     ) ON ROWS 
     FROM [CAHPS] 
     WHERE 
     (
        StrToMember("[Date].[Date].&[" + FORMAT(NOW()-365,"yyyy-MM-ddT00:00:00")  + "]",CONSTRAINED):StrToMember("[Date].[Date].&[" + FORMAT(NOW(),"yyyy-MM-ddT00:00:00")  + "]",CONSTRAINED)
     )

【问题讨论】:

  • 不喜欢这个...有人吗?

标签: ssas mdx measure


【解决方案1】:

一般来说,Analysis Services MDX 中的 IIF 和 CASE 语句可能会出现一些性能下降。虽然大多数 IIF 语句是相对便宜的复杂嵌套条件(包含大量 IIF 语句),但这将导致 Analysis Services 公式引擎最终将逐个单元格地运行查询。

对于高性能查询,目标是让查询在子空间模式(或块计算)而不是逐个单元格模式下运行。要在IIF 语句的上下文中执行此操作,请尝试使用SCOPE 语句。将 IIF 语句转换为 SCOPE 的一个很好的参考是 Mosha Pasumansky 的博客文章是 Performance of IIF function in MDX

顺便说一下,有关子空间计算(与逐个单元格)的更多信息,请参阅Analysis Services Performance Guide 的第 3.2.1 节

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多