使用LINKMEMBER优化MDX计算度量

时间:2013-09-23 12:41:09

标签: ssas mdx cube

我有两种报告(发送报告和接收报告),以及两种角色扮演维度(发送者和接收者)。我试图通过它的发件人/接收者比较一个组织的每个报告的金额。

我目前的查询是:

with member [Measures].[SentAmount] as ( [Receiver].[Code].&[XXX],[Measures].[Sent] )
member [Measures].[ReceivedAmount_Temp] as 
    (
        [Sender].[Code].&[XXX],
        [Measures].[Received]
    )
member [Measures].[ReceivedAmount] as
(
    LINKMEMBER
    (
        [Sender].[Code].CURRENTMEMBER,[Receiver].[Code]
    ),
    root([Sender]),
    [Measures].[ReceivedAmount_Temp]
)   
SELECT  
{ 
[Measures].[SentAmount],
[Measures].[ReceivedAmount]
} ON COLUMNS, 
NON EMPTY  
{ (
    [Sender].[Code].[Code].ALLMEMBERS
    *[Sender].[Name].[Name].ALLMEMBERS

)} FROM MyCube

结果正确但执行时间很长。特别是在真正的查询,我有15-20个措施。

是否可以以任何方式优化此查询?

2 个答案:

答案 0 :(得分:1)

这不是一个完整的解决方案,而是一种方法:如何使用“角色扮演事实表”:您将拥有两个事实表副本,名为“已发送”和“已接收”。两者都将引用相同的维度“Customer”(来自Received fact表,作为接收者,以及作为发送者的Sent fact table)。另一方(已发送事实的发送方和已发送事实的接收方)也会引用客户表,这次是角色扮演维度。

从技术上讲,您可以通过DSV中的视图或命名查询来实现此功能,因为BIDS GUI不允许对两个度量值组使用一个事实表。

优势在于您不需要为查询计算任何计算量,这可能是性能不佳的主要原因。

答案 1 :(得分:0)

尝试替换显式[All]成员的root()函数。出于一个奇怪的原因,当我在计算出的度量上尝试使用LinkedMember()函数时,root()工作得很慢。

希望这对你有帮助!