2016-11-11 17 views
0

以下のMDXクエリがあります。このクエリは機能しますが、データセットが巨大ではないにもかかわらず、結果が遅いですが、結果が返されるまでに15秒以上かかるという問題があります。クエリは2秒未満で実行する必要があります(ランディングページでも使用され、待ち時間は面倒です)。 [対策]。[スター格付け]は、すべてのIF THEN ELSEロジックのためにスローダウンを引き起こしています。すべての作業は[Mean Score]に基づいており、ルックアップテーブルの範囲に基づいてルックアップテーブルから[Star Rating]が検索されます。 もし[平均スコア] < 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

、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

関連する問題