Информация об изменениях

Сообщение Ускорение агрегации от 15.12.2018 8:44

Изменено 15.12.2018 10:25 Буравчик

Расчет остатков на складе
Есть склад, на него приходит товары, с него уходят товары. Храним в базе: момент времени, товар, количество расхода/прихода.

Нужно быстро получать количество товара на любой момент времени. Чтобы посчитать количество нужно "сложить" все движения (нарастающим) до этого момента времени. Имеется запрос, который суммирует движения, но работает долго, т.к. приходится суммировать все записи о движении (записей очень-очень много).

Для ускорения можно (нужно?) хранить промежуточные результаты (например, на конец месяцы/недели/дня и т.п.). Но...
Во-первых эти промежуточные результаты нужно обновлять при каждом приходе/расходе.
Во-вторых, движение товаров может быть введено задним числом. Придется пересчитывать промежуточные итоги сразу за несколько периодов (тоже долго).

Вроде, задача достаточно типовая. Например, в 1С решается с помощью "регистров накоплений" — структуры, созданной специально для этого.

Как обычно решаются такие задачи?
Существует ли поддержка со стороны БД?
Существуют ли библиотеки, которые реализуют такое "промежуточные" результаты? (любой язык)
Ускорение агрегации
Есть склад, на него приходит товары, с него уходят товары. Храним в базе: момент времени, товар, количество расхода/прихода.

Нужно быстро получать количество товара на любой момент времени. Чтобы посчитать количество нужно "сложить" все движения (нарастающим) до этого момента времени. Имеется запрос, который суммирует движения, но работает долго, т.к. приходится суммировать все записи о движении (записей очень-очень много).

Для ускорения можно (нужно?) хранить промежуточные результаты (например, на конец месяцы/недели/дня и т.п.). Но...
Во-первых эти промежуточные результаты нужно обновлять при каждом приходе/расходе.
Во-вторых, движение товаров может быть введено задним числом. Придется пересчитывать промежуточные итоги сразу за несколько периодов (тоже долго).

Вроде, задача достаточно типовая. Например, в 1С решается с помощью "регистров накоплений" — структуры, созданной специально для этого.

Как обычно решаются такие задачи?
Существует ли поддержка со стороны БД?
Существуют ли библиотеки, которые реализуют такое "промежуточные" результаты? (любой язык)