在Sql Server Analysis Services中计算消耗的运行总计的最有效方法是什么?

时间:2009-01-15 01:12:23

标签: sql-server ssis ssas

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

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

还有其他想法吗?

3 个答案:

答案 0 :(得分:6)

我花了很多时间来弄清楚它在哪里工作,没有时间维度的层次结构。根据我的数据和我的立方体结构,这是我放在一起的内容:

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;

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

无论您在SELECT语句中指定的级别(无论是日期,月份还是年份),计算所得成员都将工作。在我的情况下,我试着尽可能接近你想要做的事情。我为我的立方体写了一个类似于你的查询,它在43秒内运行。这个新的在大约2秒内运行,我们有相当多的数据,所以它应该运行得更快,假设您已经构建了聚合等。

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

祝你好运。

答案 1 :(得分:0)

我目前正在使用的MDX非常慢,就在这里。


Sum
(
PeriodsToDate([Date of Transaction].[Date].[(All)], [Date of Transaction].[Date].CurrentMember), [Measures].[Amount - Response]
)

答案 2 :(得分:0)

利用立方体聚合,我可以看到最有效的运行方式。我们的想法是获得所有先前成员的总和+总和(parent.firstsibling:parent.prev成员,度量)+ sum(parent.parent.firstsibling:parent.parent.prevmember,measure)