Ssas MDX查询IIF与案例性能
我有这种MDX语法,当使用多维属性进行切片时,这种语法是无效的。如何提高性能?这里最好选择什么样的IIF或CASESsas MDX查询IIF与案例性能,ssas,mdx,ssas-2008,ssas-2012,Ssas,Mdx,Ssas 2008,Ssas 2012,我有这种MDX语法,当使用多维属性进行切片时,这种语法是无效的。如何提高性能?这里最好选择什么样的IIF或CASE WITH MEMBER [Measures].[test] AS IIF ( IsLeaf([Date].[MonthQtrYr].CurrentMember) = True ,IIF ( [Measures].[1 Headcount] > 0 AND [Measures].[1 Termcount]
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
)
)
)
一些建议:
IIF
总是比mdx中的CASE
快得多
IIF
带有NULL
作为其分支之一是快速的
DIVIDE
很可能比操作符/
您的度量很复杂-您希望它运行得很快吗
你能把它分解成几个指标吗?一些建议:
IIF
总是比mdx中的CASE
快得多
IIF
带有NULL
作为其分支之一是快速的
DIVIDE
很可能比操作符/
您的度量很复杂-您希望它运行得很快吗
你能把它分解成几个度量吗?除了为什么回答:
看起来大多数检查都与确定某些成员的当前级别或特定计算有关。
因此,尝试使用范围
例如
范围([Date].[MonthQtrYr].[].成员,[Measures].[test]);
这=;
终端范围;
范围([TRegrets].[Reflections].&[With Reflections],[Measures].[test]);
这=([TRegrets].[Reflections].[Not Applieve],[Measures].[1人]);
终端范围;
请尽量不要使用后期绑定,如strtomber()
。他们将服务器切换到逐单元慢速模式
要计算上一季度、本月、最长年份,请尝试使用MDX函数:滞后、提前期、平行期、父项、最后一个子项
等
将计算出的度量值用于重复条件[Measures].[1员工人数]>0和[Measures].[1员工人数]>0
,并在计算中进一步使用此度量值
我知道这可能非常困难,但主要目标是让服务器使用它喜欢的东西进行操作:稀疏数据集。而不是复杂的计算
更新:(计算示例,而不是strotmember
)
我不确定我理解的计算是否正确,因为您在提供的代码中没有提到它们。但是这里有一些关于这个问题的想法
年>季度>月>日报告日期维度的层次结构示例:
Max Year计算为最大值为Count
measure的年份(注释中的未过滤结果):
下一个是当前月份的(带yyyyymm键),如果您正好需要这个月,而不需要动态:
对于动态计算,可以使用PrevMember
或ParallelPeriod
我还不知道[Measures].[PrevQtr]
用法的一般概念。看起来是本季度,是吗
如果您提供有关用于此度量的每个计算的更多详细信息,我们可以尝试创建更快的代码。除了whytheq回答:
看起来大多数检查都与确定某些成员的当前级别或特定计算有关。
因此,尝试使用范围
例如
范围([Date].[MonthQtrYr].[].成员,[Measures].[test]);
这=;
终端范围;
范围([TRegrets].[Reflections].&[With Reflections],[Measures].[test]);
这=([TRegrets].[Reflections].[Not Applieve],[Measures].[1人]);
终端范围;
请尽量不要使用后期绑定,如strtomber()
。他们将服务器切换到逐单元慢速模式
要计算上一季度、本月、最长年份,请尝试使用MDX函数:滞后、提前期、平行期、父项、最后一个子项
等
将计算出的度量值用于重复条件[Measures].[1员工人数]>0和[Measures].[1员工人数]>0
,并在计算中进一步使用此度量值
我知道这可能非常困难,但主要目标是让服务器使用它喜欢的东西进行操作:稀疏数据集。而不是复杂的计算
更新:(计算示例,而不是strotmember
)
我不确定我理解的计算是否正确,因为您在提供的代码中没有提到它们。但是这里有一些关于这个问题的想法
年>季度>月>日报告日期维度的层次结构示例:
Max Year计算为最大值为Count
measure的年份(注释中的未过滤结果):
下一个是当前月份的(带yyyyymm键),如果您正好需要这个月,而不需要动态:
对于动态计算,可以使用PrevMember
或ParallelPeriod
我还不知道[Measures].[PrevQtr]
用法的一般概念。看起来是本季度,是吗
如果您提供有关用于此度量的每个计算的更多详细信息,我们可以尝试创建更快的代码。同意。分解复杂度量之后,最显著的改进是可能的。因为内存消耗和缓存中间结果。感谢您的回复。。是的,我可以分解,但不确定,因为我可能需要再次检查条件,不是吗?@Naveej多维数据集的日期维度中是否有未来的日期,或者日期维度中的最后一个日期是今天?在我们的立方体中是后者。分解复杂度量之后,最显著的改进是可能的。因为内存消耗和缓存中间结果。感谢您的回复。。是的,我可以分解,但不确定,因为我可能需要再次检查条件,不是吗?@Naveej多维数据集的日期维度中是否有未来的日期,或者日期维度中的最后一个日期是今天?在我们的立方体中是后者。谢谢Alex…将尝试使用范围。我怎样才能做到这一点
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;