1

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

我目前的查询是:

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 个措施的实际查询中。

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

4

2 回答 2

1

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

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

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

于 2013-09-26T16:36:02.777 回答
0

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

希望这对你也有帮助!

于 2013-11-29T15:30:40.047 回答