2016-11-03 2 views
0

쿼리에 전달 된 매개 변수를 사용하여 이번 달의 SSRS 보고서를 한 달에 한 달 쌓아 올리는 쿼리가 있습니다. 문제는 너무 많은 고객, 부품 번호 등으로 인해 쿼리가 너무 오래 실행되고 있기 때문입니다. 더 나은 쿼리를 작성하거나 속도를 향상시킬 수있는 방법이 있습니까? 미안 해요, 이거 아주 새로운데. 다음은 쿼리입니다 ...MDX 쿼리가 느림

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)) 

감사합니다

나는 당신의 WHERE 절에서 다음과 같은 이동하려고 유혹 할 것
+0

정말로 단순화 한 다음 섹션을 추가 했습니까? 다시 실행하고, 다른 비트를 추가 한 다음 등을 거쳐 병목 현상이 발생한 위치를 찾으십시오. – whytheq

+0

특이한 점은 WHERE 절에서'.currentmember'를 사용한다는 것입니다. – whytheq

답변

0

:

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

그래서 WITH 절은 다음이 될 수 다음과 같이하십시오 :

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

안녕하세요 whytheq. 위의 제안을 시도한 후 제안 된 솔루션을 제외하고 원본 스크립트와 동일한 시간이 걸립니다. 추가 데이터를 가져와야하는 것은 아닙니다. 질의를 상당히 늦추는 것은 [부품 번호]의 교차 결합입니다. 이를 사용하지 않으면 쿼리 실행에 5 초가 걸립니다. 부품 번호는 최대 45 분이 소요됩니다. 문제는 부품 번호가 가장 중요하고 데이터베이스에 많은 부품 번호가 있다는 것입니다. – GarethS