Как заменить TSQL-курсор и скалярные функции - PullRequest
0 голосов
/ 27 января 2012

У меня есть приложение, которое запускает симуляцию на временных данных.Расчеты не слишком сложны, однако для расчета требуются предварительно предсказанные временные данные в той же имитации.

Давайте предположим, что имитация использует данные за 1 неделю с точками данных с 15-минутным интервалом.Упрощенный расчет для прогнозируемого значения выглядит следующим образом:

PredictedValue = A + B + C + D

Чтобы получить значения B, C и D, для моделирования требуются предварительно рассчитанные данные при t0, t-1, t-95, t-96, т-672 и т-673.Это временные данные для текущего и предыдущего интервала, текущего и предыдущего интервала предыдущего дня и текущего и предыдущего интервала предыдущей недели.

У меня есть рабочая реализация, которая имитирует данные за любой период времени, однако производительность крайне низкаяс большими наборами данных.

Реализация использует курсор TSQL для циклического перебора временных данных при моделировании и скалярную функцию для извлечения ранее рассчитанных данных.

В основном, чем больше набор данных, тем медленнее выполняется симуляция.Например, моделирование с использованием данных за 1 день занимает <1 минуту;симуляция с месяцем данных занимает 2-3 дня. </p>

Мне действительно интересно, как можно повысить производительность кода TSQL без использования курсора или скалярных функций.

1 Ответ

1 голос
/ 13 марта 2012

В этом случае я бы предложил использовать самостоятельное соединение.Затем SQL-сервер может обработать ваш запрос как набор, что значительно увеличит скорость.

Упрощенный пример, при условии, что таблица имеет два столбца (дата, значение) и называется Data

SELECT (A.value + B.value) as Prediction
FROM [Data] A left join [Data] B
ON B.date = dateadd(day,-1, A.date)
* 1005.* (сделано без тестирования, поэтому может содержать опечатки - но я надеюсь, что вы получите картину).

Удачи, Отто.

...