Ускорение агрегатов обычно выполняется за счет сохранения дополнительных таблиц.
Предполагается, что размер таблицы detail(id, dimA, dimB, dimC, value)
, если вы хотите, чтобы производительность AVG (или других агрегатных функций) была почти постоянной, независимо от количествазаписей, которые вы могли бы представить новую таблицу
dimAavg(dimA, avgValue)
- Размер этой таблицы будет зависеть только от количества различных значений dimA (более того, эта таблица может иметь смысл в вашейспроектировать, так как он может содержать область значений, доступных для dimA, подробно (и другие атрибуты, относящиеся к значениям домена; у вас может быть / должна быть уже такая таблица)
- Эта таблица полезна только в том случае, если вы будете анализировать с помощьюТолько dimA, когда вам понадобится AVG (значение) в соответствии с dimA и dimB, оно станет бесполезным. Итак, вам нужно знать, по каким атрибутам вы хотите провести быстрый анализ. Количество строк, необходимое для хранения агрегатов по нескольким атрибутам
n(dimA) x n(dimB) x n(dimC) x ...
, который может расти или не расти довольно быстро. - Поддержаниеэта таблица увеличивает стоимость обновлений (в т.ч.вставляет и удаляет), но есть и другие способы оптимизации, которые вы можете использовать ...
Например, давайте предположим, что система преимущественно выполняет вставку, а обновляет и удаляет только изредка.
Позволяетдалее предположим, что вы хотите анализировать только по dimA и что id
s увеличиваются.Тогда наличие такой структуры, как
dimA_agg(dimA, Total, Count, LastID)
, может помочь без значительного влияния на систему.
Это потому, что у вас могут быть триггеры, которые не будут срабатывать при каждой вставке, но, скажем, всегда100 вставок.
Таким образом, вы все еще можете получить точные агрегаты из этой таблицы и таблицы подробностей с
SELECT a.dimA, (SUM(d.value)+MAX(a.Total))/(COUNT(d.id)+MAX(a.Count)) as avgDimA
FROM details d INNER JOIN
dimA_agg a ON a.dimA = d.dimA AND d.id > a.LastID
GROUP BY a.dimA
Приведенный выше запрос справильные индексы получат одну строку из dimA_agg
и только менее 100 строк из detail
- это будет работать почти в постоянное время (~ log fanout n) и не потребует обновления до dimA_agg
длякаждая вставка (сокращение штрафов за обновление).
Значение 100 было приведено в качестве примера, вы должны найти оптимальное значение самостоятельно (или даже оставить его переменным, хотя в этом случае только триггеров будет недостаточно).
Сохранение удалений и обновлений должно запускаться при каждой операции, но вы все равно можете проверить, находится ли идентификатор удаляемой или обновленной записи в статистике или нет, чтобы избежать ненужных действий.sary обновления (сэкономит некоторый ввод / вывод).
Примечание: анализ сделан для домена с дискретными атрибутами;при работе с временными рядами ситуация усложняется - вам необходимо выбрать степень детализации домена, в котором вы хотите сохранить сводку.
РЕДАКТИРОВАТЬ
Есть также материализованных представлений , 2 , 3