Здравствуйте, 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>Буду благодарен любым мыслям, как можно увеличить скорость... Новое железо не предлагать
)
Может проще курсором за один проход все посчитать?