Ssas 用LINKMEMBER优化MDX计算测度

Ssas 用LINKMEMBER优化MDX计算测度,ssas,mdx,cube,Ssas,Mdx,Cube,我有两种报告(发送报告和接收报告)和两个角色扮演维度(发送者和接收者)。我正试图通过一个组织的发送者/接收者来比较每个报告中的金额 我目前的查询是: with member [Measures].[SentAmount] as ( [Receiver].[Code].&[XXX],[Measures].[Sent] ) member [Measures].[ReceivedAmount_Temp] as ( [Sender].[Code].&[XXX],

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

我目前的查询是:

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个度量


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

这不是一个完整的解决方案,而是一种方法:使用“角色扮演事实表”怎么样:您将拥有两个事实表副本,分别命名为“已发送”和“已接收”。两者都将引用相同的维度“Customer”(作为接收方来自接收的事实表,作为发送方来自发送的事实表)。另一方(接收事实的发送方和发送事实的接收方)也将引用customer表,这次使用角色扮演维度

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


这样做的好处是,您的查询不需要任何计算出的度量,这可能是性能不佳的主要原因。

这不是一个完整的解决方案,而是一种方法:使用“角色扮演事实表”怎么样:您将有两个事实表副本,分别命名为“发送”和“接收”。两者都将引用相同的维度“Customer”(作为接收方来自接收的事实表,作为发送方来自发送的事实表)。另一方(接收事实的发送方和发送事实的接收方)也将引用customer表,这次使用角色扮演维度

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

这样做的好处是,查询不需要任何计算出的度量值,这可能是性能不佳的主要原因。

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

希望这对你也有帮助

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


希望这对你也有帮助

您可以更改多维数据集,或者这必须是对现有多维数据集的MDX的优化吗?最好不要更改现有多维数据集。但若MDX的优化是不可能的,我可以进行更改。不幸的是,我仍然找不到任何解决方案。我非常感谢您的帮助。您可以更改多维数据集吗?或者这必须是对现有多维数据集的MDX进行优化吗?最好不要更改现有多维数据集。但若MDX的优化是不可能的,我可以进行更改。不幸的是,我仍然找不到任何解决方案。我将非常感谢任何帮助。看起来这是一个很好的简单的解决方案。我一定要试试这个。不好的是,这个查询中使用的4个事实表中有3个非常大,需要很长时间来处理。看起来是一个很好的简单解决方案。我一定要试试这个。不好的是,此查询中使用的4个事实表中有3个非常大,处理时间很长。