2016-11-11 14 views
0

У меня есть запрос MDX ниже. Этот запрос работает, проблема в том, что он медленный, занимает> 15 секунд, чтобы возвращать результаты, даже если набор данных не огромен. Я считаю, что запрос должен выполняться в течение 2 секунд (его также используют на целевой странице, а время ожидания назойливое). [Измерения]. [Звездный рейтинг] вызывает замедление из-за всей логики IF, ЕСЛИ ELSE. Все его действия основаны на [Среднем значении], он находит [Звездный рейтинг] из таблицы поиска в зависимости от диапазона в таблице поиска. . если [средний балл] < 86, [звезды] = 1 если [средний балл]> = 86 и < = 90, [звезды] = 2Вычисленная оценка SSAS на основе другой рассчитанной меры

кода [Mean Score] простой расчет суммы/кол , Он может изменяться в зависимости от диапазона дат, который используется как параметр. Можете ли вы рекомендовать либо оптимизацию в существующем запросе ниже, либо рекомендовать альтернативный способ расчета [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

нет любви на этом ... никому? – SQLSeeker

ответ

0

В общем, IIF и CASE-операторы внутри Analysis Services MDX потенциально могут видеть некоторое снижение производительности. Хотя большинство заявлений IIF являются относительно недорогими, сложными вложенными условиями (с множеством инструкций IIF), это приведет к тому, что механизм формулы Analysis Services завершит выполнение запроса по ячейкам.

Для выполнения запросов, задача состоит в том, чтобы запрос выполнялся в режиме подпространства (или вычислении блока) вместо режима по ячейкам. Чтобы сделать это в контексте, если IIF заявления, попробуйте использовать SCOPE заявления. Отличная ссылка на конвертацию IIF заявлений на номер SCOPE - это сообщение в блоге Mosha Pasumansky: Performance of IIF function in MDX.

Кстати, для получения дополнительной информации о подпространстве вычисления (по сравнению с клеткой-на-клетки), пожалуйста, обратитесь к разделу 3.2.1 Analysis Services Performance Guide