3

我在 SSAS 2005 中有一个多维数据集,可以计算数百万条记录的运行总和。当前的实现是在 MDX 中使用 PeriodsToDate 求和函数,它非常慢,在某些情况下需要 15 分钟或更长时间才能返回结果。这个问题有很多解决方案,所以我希望其他人已经测试了其中的一些,并且可以节省我实施和测试每个解决方案的时间。

使用游标在 T-SQL 中计算运行总和和滑动窗口类型计算是否更可取(请不要使用 Celko 的交叉连接解决方​​案,我知道它们在纸上看起来不错,但是随着数据的增长,交叉连接解决方​​案非常慢),使用SSIS 中的脚本任务(或者在集成服务中是否有更好的方法来执行此操作)或在 Analysis Services 中使用 MDX?

还有其他想法吗?

4

3 回答 3

7

我花了一点时间来弄清楚它在时间维度上有没有层次结构的情况下可以工作。根据我的数据和我的多维数据集结构,这是我放在一起的内容:

with member [Measures].[RunningTotal] as 
'sum({[Deferred Revenue Date].[Standard Calendar].CurrentMember.Level.Item(0):[Deferred Revenue Date].[Standard Calendar].CurrentMember}, [Measures].[Deferred Revenue Amount])'
select
    {[Measures].[Deferred Revenue Amount]
    ,[Measures].[RunningTotal]
    } on columns,
    nonempty([Deferred Revenue Date].[Standard Calendar].[Date], [Measures].[Deferred Revenue Amount]) on rows
from
DW;

一个技巧是 nonempty() 子句,如果维度和度量有交集,它只会在计算的度量列中返回值。没有它,您将在度量列中得到一堆 NULL,在计算的度量列中得到一堆重复值。这实际上是一个非常方便的查询。

无论您在 SELECT 语句中指定的级别如何,无论是日期、月份还是年份,计算的成员都将起作用。就我而言,我尝试约会尽可能接近你想要做的事情。我为我的多维数据集编写了一个类似于您的查询,它在 43 秒内运行。这个新的运行大约 2 秒,我们有相当多的数据,所以它也应该运行得更快,假设你已经构建了聚合等。

MDX 的问题是有十八种方法可以做某事,但只有一两种可以运行良好。

祝你好运。

于 2009-01-16T22:57:26.647 回答
0

我现在用的MDX很慢,就是这样。


Sum
(
PeriodsToDate([Date of Transaction].[Date].[(All)], [Date of Transaction].[Date].CurrentMember), [Measures].[Amount - Response]
)
于 2009-01-15T21:37:40.340 回答
0

我可以看到使用多维数据集聚合进行总计的最有效方法。这个想法是得到所有先前成员的总和 + sum(parent.firstsibling:parent.prev member,measure)+ sum(parent.parent.firstsibling:parent.parent.prevmember,measure)

于 2014-03-12T17:36:13.563 回答