2016-11-11 171 views
0

我在下面有一个MDX查询。此查询有效,问题是速度慢,即使数据集不是很大,也需要15秒才能返回结果。我相信查询应该在2秒内执行(它也用于登录页面,等待时间很麻烦)。 [度量]。[星级]由于所有IF THEN ELSE逻辑而导致速度减慢。它的所有操作都基于[平均分],它根据查找表中的范围从查找表中找到[星级]。 例如如果[平均分数] < 86,[星级] = 1 如果[平均分]> = 86和< = 90,[星级] = 2SSAS根据另一个计算的度量计算度量值

的[平均分]是一个简单的总和/数计算。 它可以根据用作参数的日期范围进行更改。 您可以推荐在下面的现有查询中进行优化,还是推荐一种替代方法来计算[星级]?

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) 
    ) 
+0

没有爱的3.2.1节这个...任何人? – SQLSeeker

回答

0

一般情况下,分析服务MDX内IIF和CASE语句可能会看到一些性能下降。尽管大多数IIF语句相对便宜,且嵌套条件复杂(包含大量的IIF语句),但这会导致Analysis Services公式引擎最终会逐个单元地运行查询。

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

顺便说一句,子空间上计算的详细信息(对细胞的细胞),请参阅Analysis Services Performance Guide