Re: Скользящее окно (аналитические функции)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 14.05.10 13:29
Оценка:
Здравствуйте, amalakhov, Вы писали:

A>Что-то зачастил я сюда... Ну да ладно.

A>Имеем:

A>
A>CREATE TABLE [dbo].[Science_data](
A>    [id] [bigint] NOT NULL,
A>    [UTC] [datetime] NOT NULL,
A>    [SC2] [int] NOT NULL,
A>    [SC2avg] [float],
A> CONSTRAINT [PK_Science_data] PRIMARY KEY CLUSTERED 
A>(
A>    [id] ASC
A>) ON [PRIMARY]
A>) ON [PRIMARY]
A>


A>Нужно в SC2avg для каждой записи просчитать среднее в окне +/- 2 часа вокруг текущего фрейма. Вопрос не в том, _КАК_ делать, а в том, _как бы побыстрее_.

A>Запрос "в лоб" вида

A>
A>UPDATE Science_data SET SC2avg = (SELECT AVG(SC2) FROM Science_data WHERE UTC BETWEEN DATEADD(hour, -1, UTC) AND DATEADD(hour, 1, UTC))
A>

A>Выполняется неприлично долго. Т.е. просто SELECT AVG(SC2)... выполняется порядка секунды. Объемы базы — по записи в секунду (т.е. 2 часа — 7200 строк), среднее надо прописывать для каждого ряда в пределах полугода-года.


DATEADD для оптимизатора — черный ящик. Вычисляй значение диапазона дат заранее и подставляй в запрос.


A>Буду благодарен любым мыслям, как можно увеличить скорость... Новое железо не предлагать )

Может проще курсором за один проход все посчитать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.