我有这种MDX语法,使用多维度属性切片时效率不高。我该如何改善表现?在这里最好选择IIF还是CASE?
WITH
MEMBER [Measures].[test] AS
IIF
(
IsLeaf([Date].[MonthQtrYr].CurrentMember) = True
,IIF
(
[Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0
,
[Measures].[1 Termcount] / [Measures].[1 Headcount]
,null
)
,IIF
(
[Date].[MonthQtrYr].CurrentMember IS [Date].[MonthQtrYr].[All]
AND
[Date].[Month].CurrentMember IS [Date].[Month].[All]
AND
[Date].[Quarter].CurrentMember IS [Date].[Quarter].[All]
AND
[Date].[Week].CurrentMember IS [Date].[Week].[All]
AND
[Date].[WeekbyYr].CurrentMember IS [Date].[WeekbyYr].[All]
,IIF
(
[Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0
,
[Measures].[1 Termcount]
/
IIF
(
[TRegrets].[Regrets].CurrentMember IS [TRegrets].[Regrets].&[With Regrets]
,(
[TRegrets].[Regrets].&[Not Applicable]
,[Measures].[1 Headcount]
)
,[Measures].[1 Headcount]
)
,null
)
,IIF
(
[Date].[MonthQtrYr].CurrentMember
IS
StrToMember
(
"[Date].[MonthQtrYr].[Year].&[" + Cstr([Measures].[MaxYear]) + "]"
)
OR
[Date].[Quarter].CurrentMember
IS
StrToMember
("[Date].[Quarter].&["
+
StrToMember
(
"[Date].[Quarter].&[Q" + Cstr([Measures].[PrevQtr]) + "]"
).NextMember.Member_Caption
+ "]"
)
,StrToMember("[Date].[Month].&[" + Cstr([Measures].[CurrMo]) + "]")
,[Date].[MonthQtrYr].CurrentMember.LastChild
)
)
)
答案 0 :(得分:3)
除了 whytheq 回答:
E.g。
SCOPE ([Date].[MonthQtrYr].[<LeafLevelName>].Members,[Measures].[test]);
THIS = <calculation #1>;
END SCOPE;
SCOPE ([TRegrets].[Regrets].&[With Regrets],[Measures].[test]);
THIS = ([TRegrets].[Regrets].&[Not Applicable],[Measures].[1 Headcount]);
END SCOPE;
StrToMember()
这样的后期绑定。他们将服务器切换到慢速逐个单元模式。要计算previous quarter, current month, max year
尝试使用MDX函数:Lag, Lead, ParallelPeriod, Parent, LastChild
等。
[Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount] > 0
使用计算的度量,并在计算中进一步使用此度量。我知道这可能非常困难,但主要目标是让服务器运行它喜欢的东西:稀疏的数据集。而不是棘手的计算。
更新(计算的例子代替StrToMember
)
我不确定我理解计算是否正确,因为您没有在提供的代码中提及它们。但是这里有一些想法。
Year > Quarter > Month > Day
维度的Report Date
层次结构示例:
最高年度计算为年份,最多为Count
次度(评论中未过滤的结果):
接下来是当前月(使用YYYYMM键),如果你这个月完全需要没有动态:
对于动态计算,可以使用PrevMember
或ParallelPeriod
。
我还没有[Measures].[PrevQtr]
用法的一般概念。看起来像是当前季度,不是吗?
如果您提供有关此度量使用的每个计算的更多详细信息,我们可以尝试创建更快的代码。
答案 1 :(得分:2)
一些建议:
在IIF
中,{p> CASE
几乎总是比mdx
更快
IIF
NULL
作为其分支之一很快。
DIVIDE
可能比运营商/
您的措施很复杂 - 您希望它能够快速运行吗?
你能将它分解成几种措施吗?