Здравствуйте, amalakhov, Вы писали:
A>Там всё несколько сложнее, увы... SC2 — на самом деле varbinary(32), int'ы из которого в селектах достаются через substring.
Это печально. Возможно, на "доставание" много времени и уходит. А нормализовать не получится?
A>А во-вторых, ставить индекс на varbinary в таблицу размером в 30 млн строк... мне страшно ) И опять же, это вопрос приоритетов — это скользящее среднее не так часто нужно высчитывать, чем например добавлять туда данные, так что я лучше буду ждать по 30 минут, чем поставлю ещё один индекс... Ну — имхо есессно.
Возможно помог бы индекс по UTC и что-то типа
select sd.id, avg(av.SC2)
from Science_data sd
join Science_data av
on av.UTC between DATEADD(hour, -1, sd.UTC) AND DATEADD(hour, 1, sd.UTC)
where sd.UTC between <ваши полгода>
group by sd.id
Кстати выбор кластерного индекса тоже вызывает сомнение. Доступ к отдельным отсчетам по id это частая операция?
Если таблицу трогать не хочется, можно предложить вот что. Для расчета делать выборку за полгода в отдельную таблицу с нормализацией (можно задействовать динамический SQL). На этой таблице построить индекс по UTC, сделать расчет запросом выше и обновить исходную таблицу.