2016-11-11 2 views
0

아래 MDX 쿼리가 있습니다. 이 쿼리는 작동 속도가 느리며 데이터 세트가 크지 않더라도 결과를 반환하는 데 15 초 이상 걸립니다. 나는이 쿼리가 2 초 이내에 실행되어야한다고 생각한다. (랜딩 페이지와 대기 시간에 너무주의를 기울인다.) [대책]. [별점 등급]은 모든 IF THEN ELSE 논리로 인해 속도가 느려지고 있습니다. 모든 작업은 [Mean Score]를 기반으로하며 조회 테이블의 범위를 기반으로 조회 테이블에서 [Star Rating]을 찾습니다. 예 : 만약 [평균 점수] < 86 [등급 = 1 [평균 점수]> = 86 = 90 < [등급 = 2SSAS 다른 계산 된 계수를 기반으로 계산 된 계수

에서 [평균 점수] 단순한 합/카운트 계산이면 . 매개 변수로 사용되는 기간에 따라 변경할 수 있습니다. 아래 기존 쿼리에서 최적화를 권하거나 [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) 
    ) 
+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