2016-04-17 4 views
0

Ich schreibe eine MDX-Abfrage, in der ich einige Kennzahlen auswählen und während der Auswahl habe ich eine where-Bedingung, in der ich ein Kreuz mache zwei Fakten zu verbinden, ist ein Datum und ein anderes eine eindeutige ID und Ich übergebe 2000 eindeutige IDs und die Abfrage dauert ungefähr 20 Minuten, um auszuführen und das Ergebnis zu geben.MDX Query Optimierung bei der Verwendung von CrossJoin

Hier finden Sie Abfrage für die gleiche

SELECT {[Measures].[TOTAL1], [Measures].[TOTAL2], [Measures].[TOAL3]} ON COLUMNS, 
      " + " {TOPCOUNT(FILTER([ID].[Ids].MEMBERS, 
          [ID].CurrentMember > 0), 
           5,[Measures].[TOTAL])} " + "ON ROWS 
    FROM [CHARTS] 
    WHERE({[Date].&[2015-09-01 00:00:00.0]}*{[NUM].[1],[NUM].[10]," 
       + "[NUM].[18],[NUM].[47],[NUM].[52],[NUM].[105],[NUM].[126],[NUM].[392]," 
       + "[NUM].[588],[NUM].[656],[NUM].[995],[NUM].[1005],[NUM].[1010],[NUM].[1061]})"; 

Die gerade mdx, ohne dass die String-Manipulation Operatoren (+) ist wie folgt:

SELECT 
    { 
    [Measures].[TOTAL1] 
    ,[Measures].[TOTAL2] 
    ,[Measures].[TOAL3] 
    } ON COLUMNS 
,{ 
    TopCount 
    (
     Filter 
     (
     [ID].[Ids].MEMBERS 
     , 
     [ID].CurrentMember > 0 
    ) 
    ,5 
    ,[Measures].[TOTAL] 
    ) 
    } ON ROWS 
FROM [CHARTS] 
WHERE 
    {[Date].&[2015-09-01 00:00:00.0]} 
    * 
    { 
     [NUM].[1] 
    ,[NUM].[10] 
    ,[NUM].[18] 
    ,[NUM].[47] 
    ,[NUM].[52] 
    ,[NUM].[105] 
    ,[NUM].[126] 
    ,[NUM].[392] 
    ,[NUM].[588] 
    ,[NUM].[656] 
    ,[NUM].[995] 
    ,[NUM].[1005] 
    ,[NUM].[1010] 
    ,[NUM].[1061] 
    }; 

Können Sie mir bitte erklären, die verschiedenen Leistungsoptimierungstechniken für das Selbe.

+0

taten unter Hilfe meines Vorschlag, oder bin ich in Ordnung, es zu löschen? – whytheq

Antwort

0

TopCount ist langsam, wenn Sie den dritten Ordnungsparameter verwenden - es ist besser, die Daten zuerst und dann füttern vorbestellten Sets in TopCount mit nur 2 Parametern bestellen:

WITH 
    SET [S0] AS 
    Filter 
    (
     [ID].[Ids].MEMBERS 
    , 
     [ID].CurrentMember > 0 
    ) 
    SET [S1] AS 
    Order 
    ( 
     [S0] 
    ,[Measures].[TOTAL] 
    ,BDESC 
    ) 
    SET [S2] AS 
    TopCount 
    (
     [S1] 
    ,5 
    ) 
SELECT 
    { 
    [Measures].[TOTAL1] 
    ,[Measures].[TOTAL2] 
    ,[Measures].[TOAL3] 
    } ON COLUMNS 
,[S2] ON ROWS 
FROM [CHARTS] 
WHERE 
    {[Date].&[2015-09-01 00:00:00.0]} 
    * 
    { 
     [NUM].[1] 
    ,[NUM].[10] 
    ,[NUM].[18] 
    ,[NUM].[47] 
    ,[NUM].[52] 
    ,[NUM].[105] 
    ,[NUM].[126] 
    ,[NUM].[392] 
    ,[NUM].[588] 
    ,[NUM].[656] 
    ,[NUM].[995] 
    ,[NUM].[1005] 
    ,[NUM].[1010] 
    ,[NUM].[1061] 
    }; 
Verwandte Themen