2015-03-31 150 views
0

我有如下一个MDX查询:这个MDX可以优化吗?

WITH 
MEMBER [Measures].[Percentage of All Accounts] AS [Measures].[SUM Principal EUR]/SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]) 
SELECT 
    NON EMPTY 
    { 
     [Measures].[SUM Principal EUR], 
     [Measures].[SUM Principal USD], 
     [Measures].[SUM Principal Local Currency], 
     [Measures].[Percentage of All Accounts] 
    } ON COLUMNS, 
    NON EMPTY 
    { (
     [Contract].[Product Group].ALLMEMBERS, 
     [Dates].[YearMonth].ALLMEMBERS 
    ) } ON ROWS 
FROM 
(
    SELECT 
    { (
     STRTOSET(@ContractProductGroup, CONSTRAINED), 
     STRTOSET(@DatesYearMonth, CONSTRAINED) 
    ) } ON 0 
    FROM [Assets] 
) 
WHERE 
{ 
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] }, 
    [Assets Cont].[Contract Status].&[C1] 
} 

可以这样进行优化?

我知道你不能在你的机器上运行它,但我想知道在这个查询中是否有某些东西不是很好的做法,或者它可以做得更好。

回答

1

您可以通过引入一些空值来使您的自定义度量更稀疏。
同样在您的ON ROWS为什么不只是使用正常的交叉连接。
尝试.MEMBERS而不是.ALLMEMBERS函数。
您可以尝试在WITH子句中创建自定义设置:[nonEmpSet] 另外,我已将WHERE子句中的花括号更改为元组花括号,因为这是更标准的。

WITH 
    SET [nonEmpSet] AS 
    NonEmpty 
    (
     { 
     [Contract].[Product Group].MEMBERS * [Dates].[YearMonth].MEMBERS 
     }, 
    ,[Measures].[SUM Principal EUR] 
    ) 
    MEMBER [Measures].[Accounts NEW] AS 
    Aggregate 
    (
     { 
     [Contract].[Product Group].&[P1] 
     ,[Contract].[Product Group].&[P2] 
     ,[Contract].[Product Group].&[P3] 
     } 
    ,[Measures].[SUM Principal EUR] 
    ) 
    MEMBER [Measures].[Percentage of All Accounts] AS 
    IIF 
    (
     [Measures].[Accounts NEW] = 0 
    ,null 
    , 
     [Measures].[SUM Principal EUR]/[Measures].[Accounts NEW] 
    ) 
SELECT 
    NON EMPTY 
    { 
     [Measures].[SUM Principal EUR] 
    ,[Measures].[SUM Principal USD] 
    ,[Measures].[SUM Principal Local Currency] 
    ,[Measures].[Percentage of All Accounts] 
    } ON COLUMNS 
,NON EMPTY 
    [nonEmpSet] ON ROWS 
FROM 
(
    SELECT 
    { 
     (
     StrToSet 
     (@ContractProductGroup 
     ,CONSTRAINED 
     ) 
     ,StrToSet 
     (@DatesYearMonth 
     ,CONSTRAINED 
     ) 
    ) 
    } ON 0 
    FROM [Assets] 
) 
WHERE 
    (
    { 
     [Contract].[Unit].&[U1] 
    ,[Contract].[Unit].&[U2] 
    ,[Contract].[Unit].&[U3] 
    } 
    ,[Assets Cont].[Contract Status].&[C1] 
); 
+0

谢谢您的建议。我刚刚做到了这一点,但不幸的是没有注意到任何时间的改进。 – irusul 2015-03-31 14:20:11

+0

@irusul - 让我编辑我的脚本,因为我认为我可以看到一个问题 - 您的“ON ROWS”代码很奇怪 - 为什么不直接进行正常的交叉连接? – whytheq 2015-03-31 14:52:50

+0

这是交叉连接的另一种方式,无论如何,性能是相同的。 – irusul 2015-03-31 14:59:26

0

如果不是一个问题,创建如下立方体级成员:

CREATE 
MEMBER [Measures].[Percentage of All Accounts] AS NULL; 

SCOPE(
{ 
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] }, 
    [Assets Cont].[Contract Status].&[C1] 
}); 

[Measures].[Percentage of All Accounts] = 
Measures].[SUM Principal EUR] 
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]); 

END SCOPE; 

另外,在查询中使用的NonEmpty()功能摆脱不必要crossjoins的。

SELECT 
    NON EMPTY 
    { 
     [Measures].[SUM Principal EUR], 
     [Measures].[SUM Principal USD], 
     [Measures].[SUM Principal Local Currency], 
     [Measures].[Percentage of All Accounts] 
    } ON COLUMNS, 
    NON EMPTY 
    NonEmpty(
     [Contract].[Product Group].ALLMEMBERS, 
     [Dates].[YearMonth].ALLMEMBERS 
    ) ON ROWS 
FROM 
(
    SELECT 
    { (
     STRTOSET(@ContractProductGroup, CONSTRAINED), 
     STRTOSET(@DatesYearMonth, CONSTRAINED) 
    ) } ON 0 
    FROM [Assets] 
) 

编辑 - WHERE子句,而不是子选择

WITH MEMBER [Measures].[Percentage of All Accounts] AS 
[Measures].[SUM Principal EUR] 
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]) 

SELECT 
    NON EMPTY 
    { 
     [Measures].[SUM Principal EUR], 
     [Measures].[SUM Principal USD], 
     [Measures].[SUM Principal Local Currency], 
     [Measures].[Percentage of All Accounts] 
    } ON COLUMNS, 
    NON EMPTY 
    { (
     [Contract].[Product Group].ALLMEMBERS, 
     [Dates].[YearMonth].ALLMEMBERS 
    ) } ON ROWS 

    FROM [Assets] 
WHERE 
{ 
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] }, 
    [Assets Cont].[Contract Status].&[C1], 
    STRTOSET(@ContractProductGroup, CONSTRAINED), 
    STRTOSET(@DatesYearMonth, CONSTRAINED) 
} 

EDIT 2

WITH MEMBER [Measures].[Percentage of All Accounts] AS 
[Measures].[SUM Principal EUR] 
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]) 

SELECT 
    NON EMPTY 
    { 
     [Measures].[SUM Principal EUR], 
     [Measures].[SUM Principal USD], 
     [Measures].[SUM Principal Local Currency], 
     [Measures].[Percentage of All Accounts] 
    } ON COLUMNS, 
    NON EMPTY 
    { (
     STRTOSET(@ContractProductGroup, CONSTRAINED), 
     STRTOSET(@DatesYearMonth, CONSTRAINED) 
    ) } ON ROWS 

    FROM [Assets] 
WHERE 
{ 
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] }, 
    [Assets Cont].[Contract Status].&[C1] 
} 
+0

行上的NONEMPTY没有帮助。我无法创建立方体级别的成员,我有更多的成员(此处未显示)。 – irusul 2015-03-31 15:00:23

+0

@irusul如何从两个轴上彻底摆脱'NON EMPTY'? – SouravA 2015-03-31 15:12:52

+0

也尝试上面的编辑 – SouravA 2015-03-31 15:14:48