2016-10-28 52 views
0

我是MDX的新手。我試圖在SSRS報告中運行以下MDX查詢,並且需要很長時間才能完成運行。有時我必須取消查詢,因爲它太慢了。使用聚合過濾器進行MDX查詢計算成員太慢

WITH 
    --All forms ordered ASC 
    SET [OrderedSet] AS 
    Order 
    (
     NonEmpty 
     (
     [Form].[Number].[Number] 
     ,[Measures].[Sales] 
    ) 
    ,[Measures].[Sales] 
    ,BASC 
    ) 
    --Rank the forms in [orderedSet] 
    MEMBER [Measures].[Rank] AS 
    Rank 
    (
     [Form].[Number].CurrentMember 
    ,[OrderedSet] 
    ) 
    --Running Total 
    MEMBER [Measures].[Running Total] AS 
    Sum 
    (
     Head 
     (
     [OrderedSet] 
     ,(
      [Measures].[Rank] 
     ,[Form].[Number].CurrentMember 
     ) 
    ) 
    ,[Measures].[Sales] 
    ) 
    --Total Sales 
    MEMBER [Measures].[Total Sales] AS 
    Sum 
    (
     [OrderedSet] 
    ,[Measures].[Sales] 
    ) 
    --Find the spending band Sales limits 
    MEMBER [Measures].[3%Sales] AS 
    0.03 * [Measures].[Total Sales] 
    MEMBER [Measures].[8%Sales] AS 
    0.08 * [Measures].[Total Sales] 
    MEMBER [Measures].[18%Sales] AS 
    0.18 * [Measures].[Total Sales] 
    MEMBER [Measures].[38%Sales] AS 
    0.38 * [Measures].[Total Sales] 
    MEMBER [Measures].[62%Sales] AS 
    0.62 * [Measures].[Total Sales] 
    MEMBER [Measures].[82%Sales] AS 
    0.82 * [Measures].[Total Sales] 
    MEMBER [Measures].[92%Sales] AS 
    0.92 * [Measures].[Total Sales] 
    MEMBER [Measures].[97%Sales] AS 
    0.97 * [Measures].[Total Sales] 
    --Assign Sales limits for each spending bands 
    MEMBER [Measures].[MinSales] AS 
    CASE 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[0-3] 
     THEN 1 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[3-8] 
     THEN 
     [Measures].[3%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[8-18] 
     THEN 
     [Measures].[8%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[18-38] 
     THEN 
     [Measures].[18%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[38-62] 
     THEN 
     [Measures].[38%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[62-82] 
     THEN 
     [Measures].[62%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[82-92] 
     THEN 
     [Measures].[82%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[92-97] 
     THEN 
     [Measures].[92%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[97-100] 
     THEN 
     [Measures].[97%Sales] 
    END 
    MEMBER [Measures].[MaxSales] AS 
    CASE 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[0-3] 
     THEN 
     [Measures].[3%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[3-8] 
     THEN 
     [Measures].[8%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[8-18] 
     THEN 
     [Measures].[18%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[18-38] 
     THEN 
     [Measures].[38%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[38-62] 
     THEN 
     [Measures].[62%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[62-82] 
     THEN 
     [Measures].[82%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[82-92] 
     THEN 
     [Measures].[92%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[92-97] 
     THEN 
     [Measures].[97%Sales] 
     WHEN 
     [Form].[Number].CurrentMember = [Form].[Number].[97-100] 
     THEN 
     [Measures].[Total Sales] 
    END 
    --Create Spending bands based on the Running Total ranges 
    MEMBER [Form].[Number].[0-3] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > 0 
     AND 
      [Measures].[Running Total] <= [Measures].[3%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[3-8] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[3%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[8%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[8-18] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[8%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[18%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[18-38] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[18%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[38%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[38-62] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[38%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[62%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[62-82] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[62%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[82%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[82-92] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[82%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[92%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[92-97] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[92%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[97%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[97-100] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[97%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[Total Sales] 
    ) 
    ) 
SELECT 
    NON EMPTY 
    { 
     [Measures].[MinSales] 
    ,[Measures].[MaxSales] 
    ,[Measures].[Form Count] 
    ,[Measures].[Sales] 
    } ON 0 
,{ 
    [Form].[Number].[0-3] 
    ,[Form].[Number].[3-8] 
    ,[Form].[Number].[8-18] 
    ,[Form].[Number].[18-38] 
    ,[Form].[Number].[38-62] 
    ,[Form].[Number].[62-82] 
    ,[Form].[Number].[82-92] 
    ,[Form].[Number].[92-97] 
    ,[Form].[Number].[97-100] 
    } ON 1 
FROM 
(
    SELECT 
    [blah] ON COLUMNS 
    FROM [Cube] 
); 

經過幾次測試和谷歌搜索,我知道罪魁禍首是聚合過濾的表格編號的計算成員。另外[Form]。[Number]。[Number]維度是一個擁有數十萬成員的龐大維度。所以想知道我們是否在這樣一個維度上創建了一個計算成員,是否會減慢查詢速度,如果是的話,可以採取什麼措施?

非常感謝

回答

0

CASEFILTER都是緩慢的MDX函數。對於一個微不足道的CASE很容易切換到IIF這通常表現更好 - 但你有太多的條件嵌套IIF s。

三點,這可能有助於:

1.I注意到,你在你的case語句有一個錯誤 - 你應該使用IS運營商,而不是=

CASE 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[0-3] 
    THEN 1 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[3-8] 
    THEN 
    [Measures].[3%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[8-18] 
    THEN 
    [Measures].[8%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[18-38] 
    THEN 
    [Measures].[18%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[38-62] 
    THEN 
    [Measures].[38%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[62-82] 
    THEN 
    [Measures].[62%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[82-92] 
    THEN 
    [Measures].[82%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[92-97] 
    THEN 
    [Measures].[92%Sales] 
    WHEN 
    [Form].[Number].CurrentMember IS [Form].[Number].[97-100] 
    THEN 
    [Measures].[97%Sales] 
END 

2.運行WITH子句的順序是錯誤的 - 這些不同的成員[Form].[Number].[97-100]是在CASE語句中使用後計算的。

3.您對[Total Sales]的計算我無法想象需要任何排序,所以爲什麼要使用有序集?我其實你可以只使用一個元組層次結構的[全部]會員得到這個值:

--Total Sales 
MEMBER [Measures].[Total Sales] AS 
(
    [Form].[Number].[All] 
,[Measures].[Sales] 
) 

所以實現上述我們現在有:

WITH 
    --All forms ordered ASC 
    SET [OrderedSet] AS 
    Order 
    (
     NonEmpty 
     (
     [Form].[Number].[Number] 
     ,[Measures].[Sales] 
    ) 
    ,[Measures].[Sales] 
    ,BASC 
    ) 
    --Rank the forms in [orderedSet] 
    MEMBER [Measures].[Rank] AS 
    Rank 
    (
     [Form].[Number].CurrentMember 
    ,[OrderedSet] 
    ) 
    --Running Total 
    MEMBER [Measures].[Running Total] AS 
    Sum 
    (
     Head 
     (
     [OrderedSet] 
     ,(
      [Measures].[Rank] 
     ,[Form].[Number].CurrentMember 
     ) 
    ) 
    ,[Measures].[Sales] 
    ) 
    --Total Sales 
    MEMBER [Measures].[Total Sales] AS 
    (
    [Form].[Number].[All] 
    ,[Measures].[Sales] 
) 
    --Find the spending band Sales limits 
    MEMBER [Measures].[3%Sales] AS 
    0.03 * [Measures].[Total Sales] 
    MEMBER [Measures].[8%Sales] AS 
    0.08 * [Measures].[Total Sales] 
    MEMBER [Measures].[18%Sales] AS 
    0.18 * [Measures].[Total Sales] 
    MEMBER [Measures].[38%Sales] AS 
    0.38 * [Measures].[Total Sales] 
    MEMBER [Measures].[62%Sales] AS 
    0.62 * [Measures].[Total Sales] 
    MEMBER [Measures].[82%Sales] AS 
    0.82 * [Measures].[Total Sales] 
    MEMBER [Measures].[92%Sales] AS 
    0.92 * [Measures].[Total Sales] 
    MEMBER [Measures].[97%Sales] AS 
    0.97 * [Measures].[Total Sales] 
    --Create Spending bands based on the Running Total ranges 
    MEMBER [Form].[Number].[0-3] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > 0 
     AND 
      [Measures].[Running Total] <= [Measures].[3%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[3-8] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[3%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[8%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[8-18] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[8%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[18%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[18-38] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[18%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[38%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[38-62] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[38%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[62%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[62-82] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[62%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[82%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[82-92] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[82%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[92%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[92-97] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[92%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[97%Sales] 
    ) 
    ) 
    MEMBER [Form].[Number].[97-100] AS 
    Aggregate 
    (
     Filter 
     (
     [OrderedSet] 
     , 
      [Measures].[Running Total] > [Measures].[97%Sales] 
     AND 
      [Measures].[Running Total] <= [Measures].[Total Sales] 
    ) 
    ) 
    --Assign Sales limits for each spending bands 
    MEMBER [Measures].[MinSales] AS 
    CASE 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[0-3] 
     THEN 1 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[3-8] 
     THEN 
     [Measures].[3%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[8-18] 
     THEN 
     [Measures].[8%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[18-38] 
     THEN 
     [Measures].[18%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[38-62] 
     THEN 
     [Measures].[38%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[62-82] 
     THEN 
     [Measures].[62%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[82-92] 
     THEN 
     [Measures].[82%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[92-97] 
     THEN 
     [Measures].[92%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[97-100] 
     THEN 
     [Measures].[97%Sales] 
    END 
    MEMBER [Measures].[MaxSales] AS 
    CASE 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[0-3] 
     THEN 
     [Measures].[3%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[3-8] 
     THEN 
     [Measures].[8%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[8-18] 
     THEN 
     [Measures].[18%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[18-38] 
     THEN 
     [Measures].[38%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[38-62] 
     THEN 
     [Measures].[62%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[62-82] 
     THEN 
     [Measures].[82%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[82-92] 
     THEN 
     [Measures].[92%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[92-97] 
     THEN 
     [Measures].[97%Sales] 
     WHEN 
     [Form].[Number].CurrentMember IS [Form].[Number].[97-100] 
     THEN 
     [Measures].[Total Sales] 
    END 
SELECT 
    NON EMPTY 
    { 
     [Measures].[MinSales] 
    ,[Measures].[MaxSales] 
    ,[Measures].[Form Count] 
    ,[Measures].[Sales] 
    } ON 0 
,{ 
    [Form].[Number].[0-3] 
    ,[Form].[Number].[3-8] 
    ,[Form].[Number].[8-18] 
    ,[Form].[Number].[18-38] 
    ,[Form].[Number].[38-62] 
    ,[Form].[Number].[62-82] 
    ,[Form].[Number].[82-92] 
    ,[Form].[Number].[92-97] 
    ,[Form].[Number].[97-100] 
    } ON 1 
FROM 
(
    SELECT 
    [blah] ON COLUMNS 
    FROM [Cube] 
); 
+0

感謝@whytheq – user2463061

+0

@ user2463061我發現了另一個嚴重的問題 - 您應該始終在「WITH」條款中將成員放在正確的運行順序中。 – whytheq