@barolina
turn coffee into code

Какие существуют способы оптимизации подсчета суммы на больших данных?

У меня есть запрос, суть его заключается просто просуммировать данные, по заданным условиям.
Данных для подсчета более 5 мил записей.
Условия отбора разные, к примеру:

- выборка по полу
- выборка по возрасту
- выборка по региону

Если создавать materialization_view, то этот вариант отпадает, нет возможности передать условие.
Есть какие-то иные способы, оптимизации агрегации?
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
@galaxy
В общем случае не существует: вы, исходя из формулировки вопроса, хотите получать доступ к произвольным записям и суммировать произвольные колонки.

Если несколько уменьшить степень гибкости, можно преагрегировать данные для последующей аналитики (можно сказать, создать ряд materialized view). Чтобы было понятнее, пусть имеется сырая таблица продаж (я намеренно делаю ее денормализованной, в реальности это может быть несколько таблиц, которые соединяются в запросе):

sales
------------------
datetime
client_first_name
client_last_name
client_email
client_region
client_city
client_age
client_gender
product_name
product_category
product_type
product_manufacturer
product_price
quantity
shop_id
shop_region
shop_city
seller_first_name
seller_last_name
seller_department
...


Вероятно, вы не будете на регулярной основе строить отчеты по этой таблице с произвольными фильтрами и группировками. Например, вы хотите видеть данные в разрезе региона/пола/возраста покупателя, категории/типа продукта, магазина. Тогда можно сделать преагрегированную таблицу, где будет группировка по нужным полям:
SELECT client_region, client_gender, client_age, product_category, product_type, shop_id, SUM(quantity), SUM(product_price*quantity)
  FROM sales
 GROUP BY client_region, client_gender, client_age, product_category, product_type, shop_id


Также, если вы не собираетесь фильтровать по времени с точностью до секунды, а делаете отчеты максимум по дням, по полю datetime также можно сделать группировку (GROUP BY date_trunc('day', datetime)).

Чтобы не плодить кучу таблиц, можно организовать такое хранилище (обычно его называют Data warehouse) по схеме звезды.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
индексы и колоночная база
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы