我有两种报告(发送报告和接收报告),以及两种角色扮演维度(发送者和接收者)。我试图通过它的发件人/接收者比较一个组织的每个报告的金额。
我目前的查询是:
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个措施。
是否可以以任何方式优化此查询?
答案 0 :(得分:1)
这不是一个完整的解决方案,而是一种方法:如何使用“角色扮演事实表”:您将拥有两个事实表副本,名为“已发送”和“已接收”。两者都将引用相同的维度“Customer”(来自Received fact表,作为接收者,以及作为发送者的Sent fact table)。另一方(已发送事实的发送方和已发送事实的接收方)也会引用客户表,这次是角色扮演维度。
从技术上讲,您可以通过DSV中的视图或命名查询来实现此功能,因为BIDS GUI不允许对两个度量值组使用一个事实表。
优势在于您不需要为查询计算任何计算量,这可能是性能不佳的主要原因。
答案 1 :(得分:0)
尝试替换显式[All]成员的root()函数。出于一个奇怪的原因,当我在计算出的度量上尝试使用LinkedMember()函数时,root()工作得很慢。
希望这对你有帮助!