2016-11-03 3 views
0

Ich habe eine Abfrage, die einen Monat nach Datum und Jahr bis heute SSRS-Bericht für den aktuellen Monat erstellt & Jahr mit Parametern an die Abfrage übergeben. Das Problem ist, dass wegen der vielen Kunden, Teilenummern usw. die Abfrage zu lange dauert. Gibt es eine Möglichkeit, die Abfrage besser zu schreiben oder zu beschleunigen? Entschuldigung, ich bin sehr neu. Im Folgenden finden Sie die Abfrage ...Langsame MDX-Abfragen

WITH 
    MEMBER [Measures].[Key for Today] AS 
    Format 
    (
     Now(),'yyyyMMdd' 
    ) 
    MEMBER [Measures].[Today string] AS 
    '[Date].[Dates].[Day].&[' + [Measures].[Key for Today] + ']' 

    MEMBER [Measures].[Quantity Shipped MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Quantity Shipped] 
    ) 
    MEMBER [Measures].[Quantity Shipped YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Quantity Shipped] 
    ) 
    MEMBER [Measures].[Sales Amount MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Sales Amount] 
    ) 
    MEMBER [Measures].[Sales Amount YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Sales Amount] 
    ) 
    MEMBER [Measures].[Cost Amount MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Cost Amount - Sales] 
    ) 
    MEMBER [Measures].[Cost Amount YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Cost Amount - Sales] 
    ) 
    MEMBER [Measures].[Sales Margin MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Sales Margin] 
    ) 
    MEMBER [Measures].[Sales Margin YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Sales Margin] 
    ) 
MEMBER [Measures].[Forecast Quantity MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Quantity] 
    ) 
    MEMBER [Measures].[Forecast Quantity YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Quantity] 
    ) 
    MEMBER [Measures].[Forecast Turnover MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Total Turnover] 
    ) 
    MEMBER [Measures].[Forecast Turnover YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Total Turnover] 
    ) 
    MEMBER [Measures].[Forcast Cost MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Total Cost] 
    ) 
    MEMBER [Measures].[Forecast Cost YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Total Cost] 
    ) 
    MEMBER [Measures].[Forecast Margin MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Margin] 
    ) 
    MEMBER [Measures].[Forecast Margin YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Forecast Margin] 
    ) 
    MEMBER [Measures].[Budget Quantity MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Budget Quantity] 
    ) 
    MEMBER [Measures].[Budget Quantity YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
    ,[Measures].[Budget Quantity] 
    ) 
    MEMBER [Measures].[Budget Turnover MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Total Turnover] 
    ) 
    MEMBER [Measures].[Budget Turnover YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Total Turnover] 
    ) 
    MEMBER [Measures].[Budget Cost MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Total Cost] 
    ) 
    MEMBER [Measures].[Budget Cost YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Total Cost] 
    ) 
    MEMBER [Measures].[Budget Margin MTD] AS 
    Sum 
    (
     MTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Margin] 
    ) 
    MEMBER [Measures].[Budget Margin YTD] AS 
    Sum 
    (
     YTD([Date].[Dates].CurrentMember) 
     ,[Measures].[Budget Margin] 
    ) 
SELECT 
    { 
    [Measures].[Quantity Shipped MTD], 
    [Measures].[Sales Amount MTD], 
    [Measures].[Cost Amount MTD], 
    [Measures].[Sales Margin MTD], 
    [Measures].[Margin %], 
    [Measures].[Forecast Quantity MTD], 
    [Measures].[Forecast Turnover MTD], 
    [Measures].[Forcast Cost MTD], 
    [Measures].[Forecast Margin MTD], 
    [Measures].[Margin %], 
    [Measures].[Budget Quantity MTD], 
    [Measures].[Budget Turnover MTD], 
    [Measures].[Budget Cost MTD], 
    [Measures].[Budget Margin MTD], 
    [Measures].[Margin %], 
    [Measures].[Quantity Shipped YTD], 
    [Measures].[Sales Amount YTD], 
    [Measures].[Cost Amount YTD], 
    [Measures].[Sales Margin YTD], 
    [Measures].[Margin %], 
    [Measures].[Forecast Quantity YTD], 
    [Measures].[Forecast Turnover YTD], 
    [Measures].[Forecast Cost YTD], 
    [Measures].[Forecast Margin YTD], 
    [Measures].[Margin %], 
    [Measures].[Budget Quantity YTD], 
    [Measures].[Budget Turnover YTD], 
    [Measures].[Budget Cost YTD], 
    [Measures].[Budget Margin YTD], 
    [Measures].[Margin %] 
    } ON COLUMNS, 
    NON EMPTY { (
[Customer].[Customer].[Customer].ALLMEMBERS * 
[Customer Sales].[Summary Prod Group 1].[Summary Prod Group 1].ALLMEMBERS * 
[Customer Sales].[Vehicle Mode].[Vehicle Mode].ALLMEMBERS * 
[Customer Sales].[Part Number].[Part Number].ALLMEMBERS) } 
ON ROWS 
FROM (SELECT (STRTOSET(@SummaryProdGroup, CONSTRAINED)) ON COLUMNS 
FROM (SELECT (STRTOSET(@SalesSummaryCode, CONSTRAINED)) ON COLUMNS 
FROM (SELECT (STRTOSET(@BusinessType, CONSTRAINED)) ON COLUMNS FROM [Sales]))) 
Where((
StrToMember 
    (
     [Measures].[Today string],constrained 
    )), 
IIF(STRTOSET(@BusinessType, CONSTRAINED).Count = 1, STRTOSET(@BusinessType, CONSTRAINED), [Customer].[Business Type].currentmember), 
IIF(STRTOSET(@SalesSummaryCode, CONSTRAINED).Count = 1, STRTOSET(@SalesSummaryCode, CONSTRAINED), [Customer].[Sales Summary Code].currentmember)) 

Danke

+0

Haben Sie versucht, es wirklich zu vereinfachen und dann einen Abschnitt hinzufügen, dann erneut laufen, ein weiteres Bit hinzufügen, dann erneut ausführen etc, um zu versuchen, wo die Engpässe sind zu finden? – whytheq

+0

Eine Sache, die ich ungewöhnlich finde, ist die Verwendung von '.currentmember' in deiner' WHERE'-Klausel. – whytheq

Antwort

0

ich versucht sein würde, um zu versuchen die folgende aus Ihrem WHERE Klausel bewegen:

StrToMember 
    (
     [Measures].[Today string],constrained 
    ) 

So ist die WITH Klausel dann könnte wie folgt:

WITH 
    MEMBER [Measures].[Key for Today] AS 
    Format 
    (
     Now(),'yyyyMMdd' 
    ) 
    MEMBER [Measures].[Today string] AS 
    '[Date].[Dates].[Day].&[' + [Measures].[Key for Today] + ']' 
    SET [today] AS 
    StrToSet([Measures].[Today string],constrained) 
    MEMBER [Measures].[Quantity Shipped MTD] AS 
    Sum 
    (
     MTD([today].ITEM(0)) 
    ,[Measures].[Quantity Shipped] 
    ) 
    MEMBER [Measures].[Quantity Shipped YTD] AS 
    Sum 
    (
     YTD([today].ITEM(0)) 
    ,[Measures].[Quantity Shipped] 
    ) 
    ... 
    ... 
+0

Hallo whytheq. Ich habe es oben versucht und es dauert genauso lange wie beim ursprünglichen Skript, außer dass die von Ihnen vorgeschlagene Lösung zusätzliche Daten enthält, die nicht dort sein sollen. Die Sache, die die Abfrage ziemlich verlangsamt, ist der Crossjoin auf der [Teilenummer]. Ohne sie dauert die Abfrage 5 Sekunden. Mit der Teilenummer dauert es bis zu 45 Minuten. Problem ist, die Teilenummern sind die wichtigsten und wir haben Tonnen von ihnen in der Datenbank. – GarethS