Усреднение больших объемов данных в SQL Server - PullRequest
1 голос
/ 02 сентября 2010

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

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

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

Используемый мной запрос соответствует следующему общему примеру:

 select avg(value)
 from table 
 where id in(1,2,3,4) timestamp > last_year

Редактировать: Я должен также уточнить, что они просят, чтобы эти средние значения рассчитывались на скользящей основе. Как в среднем за год. Я понимаю, что просто из-за огромного количества результатов нам, возможно, придется идти на компромисс.

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

Для такого рода проблем вы всегда можете попробовать следующие решения: 1) оптимизировать запрос: посмотреть план запроса, создать некоторые индексы, выполнить дефрагментацию существующих, выполнить запрос, когда сервер свободен, и т. Д. 2) создать кеш-таблицу. Для заполнения таблицы кэша выберите одну из следующих стратегий: 1) использовать триггеры для таблиц, которые влияют на результат, а при вставке, обновлении, удалении обновлять таблицу кеша. Триггер должен работать очень, очень, очень быстро. Другое условие - не блокировать какие-либо записи (в противном случае вы окажетесь в тупике, если сервер занят) 2) заполнять таблицу кеша заданием один раз в день / час / и т. Д. 3) одно из решений, которое мне нравится, - заполнять кэш SP, когда нужен результат (например, когда пользователь запрашивает отчет), и использовать некоторую логику для сериализации процесса (одновременно может генерировать только один пользователь). кеш) плюс некоторая оптимизация, чтобы не пересчитывать те же строки в следующий раз (например: если за вчерашний день не было добавлено ни одной строки, а в кеше у меня есть результат за вчерашний день, я не пересчитываю это значение - вычисляются только новые значения из последний запуск)

0 голосов
/ 02 сентября 2010

Возможно, вы захотите включить кластерный индекс в метку времени. Обычно кластерный индекс тратится на идентификатор. Одно предостережение: порядок сортировки выходных данных других операторов SQL может измениться, если не было явной сортировки.

0 голосов
/ 02 сентября 2010

Вы можете создать кеширующую таблицу, для кеша статистики она должна иметь что-то похожее на эту структуру:

year | reads_sum  | total_reads | avg
=====|============|=============|=====
2009 | 6817896234 | 564345      |

в конце года вы заполняете среднее (среднее) поле значением, которое теперь можно быстро рассчитать.

...