如何替换TSQL游标和标量函数

时间:2012-01-26 22:39:54

标签: sql-server performance tsql cursor sql-server-2008-r2

我有一个运行时态数据模拟的应用程序。计算并不过分复杂,但计算需要在同一模拟中预先预测的时间数据。

假设使用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 个答案:

答案 0 :(得分:1)

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

简化示例,假设表有两列(日期,值)并称为数据

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

(没有经过测试,可能包含错字 - 但我希望你能得到这个图片)。

祝你好运,奥托。