2009-01-15 13 views
2

我在SSAS 2005中有一个立方体,可以计算数百万条记录的运行总和。目前的实现是在MDX中使用PeriodsToDate求和函数,并且速度非常慢,在某些情况下需要15分钟或更长时间返回结果。这个问题有大量的解决方案,所以我希望别人已经测试了一些这样的东西,并且可以为我节省执行和测试每一个的时间。什么是计算Sql Server Analysis Services中消耗运行总数的最有效方法?

使用光标在T-SQL中计算运行总和和滑动窗口类型计算是可取的吗(请不要交叉加入来自Celko的解决方案,我知道它们在纸上看起来不错,但交叉连接解决方​​案速度很慢,因为您的数据使用SSIS中的脚本任务(或者在集成服务中是否有更好的方法来完成此任务),还是在Analysis Services中使用MDX?

还有其他想法吗?

+0

你有样品你正在运行的MDX的? – 2009-01-15 16:14:21

回答

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; 

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

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

MDX的问题是有像十八种方式做一些事情,只有一两个将运行良好。

祝你好运。

+0

谢谢。这仍然不能告诉我,这是我应该在哪里进行最佳性能计算,但是告诉我如何提高我在SSAS方面的表现。经过进一步的审查,我相信我的最初设计可能会有点偏离,并会问别处的设计。 – 2009-01-16 23:54:32

0

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


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

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

相关问题