2012-01-26 70 views
0

我有一个应用程序在时态数据上运行模拟。计算过程并不复杂,但计算需要在同一模拟中先前预测的时间数据。如何替换TSQL光标和标量函数

我们假设使用1周的数据和15分钟间隔的数据点进行模拟。为预测值的简化计算如下:

PredictedValue = A + B + C + D 

为了得到B,C,和d的值,模拟需要先前计算在t0数据,T-1,T-95,T-96 ,t-672和t-673。这是当前和前一个时间间隔,前一个当前和前一个时间间隔以及前一个星期的当前和前一个时间间隔的时间数据。

我有一个可以在任何时间段模拟数据的工作实现,但是对于大型数据集,性能非常差。

该实现使用TSQL游标在仿真和标量函数下循环时间数据以检索先前计算的数据。

基本上数据集越大,模拟运行越慢。例如,使用1天的数据的模拟需要1分钟的时间<;一个月的数据模拟需要2-3天。

我对如何在不使用游标或标量函数的情况下改进TSQL代码的性能非常感兴趣。

+1

为您现有的实现共享一些代码。我们可以帮助您使用集合而不是光标来重新编写它 – 2012-01-26 22:42:37

+0

您可以发布一些代码吗? – Beth 2012-01-26 22:43:36

+0

日期/时间的性能问题通常与索引(或缺少索引)有关,并且在WHERE子句中使用功能不当。如果您强制DB引擎将功能应用于表中的每一行,例如WHERE YEAR(DATE_COL)> 2000年,随着表的增长,您会看到性能下降。 – HABO 2012-01-26 23:15:56

回答

1

在这种情况下,我会建议使用自连接。然后SQL服务器可以将您的查询作为一个集合进行处理,从而大大提高速度。

简单的例子,假设表有两列(日期值),被称为数据

SELECT (A.value + B.value) as Prediction 
FROM [Data] A left join [Data] B 
ON B.date = dateadd(day,-1, A.date) 

(没有测试,所以可能包含错字的做 - 但我希望你得到的图片)。

祝你好运,奥托。