【问题标题】:How to replace TSQL cursor and scalar functions如何替换 TSQL 游标和标量函数
【发布时间】:2012-02-20 01:02:16
【问题描述】:

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

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

PredictedValue = A + B + C + D

要获得 B、C 和 D 的值,模拟需要先前计算的 t0、t-1、t-95、t-96、t-672 和 t-673 处的数据。这是当前和前一个间隔、前一天的当前和前一个间隔以及前一周的当前和前一个间隔的时间数据。

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

该实现使用 TSQL 游标循环模拟下的时间数据,并使用标量函数检索先前计算的数据。

基本上,数据集越大,模拟运行的速度就越慢。例如,使用 1 天数据的模拟需要

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

【问题讨论】:

  • 为您现有的实现分享一些代码。我们可以帮助您使用集合而不是游标来重写它
  • 你能发布一些你的代码吗?
  • 日期/时间的性能问题通常与索引(或缺少索引)以及在 WHERE 子句中不当使用函数有关。如果您强制数据库引擎将函数应用于表中的每一行,例如WHERE YEAR(DATE_COL) > 2000,您会看到性能随着表的增长而下降。
  • 今天晚些时候我会发布一些代码。

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


【解决方案1】:

在这种情况下,我建议使用自联接。然后,SQL Server 能够将您的查询作为一个集合来处理,从而极大地提高速度。

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

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

(未经测试完成,因此可能包含错字 - 但我希望你能明白)。

祝你好运,奥托。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多