Данных правда много(относительно конечно), более 1000000. К сожалению специалистом в БД такого уровня не являюсь, как и такого же рода специалистом в алгоритмах. Поэтому на данном этапе оно умудряется тормозить везде) Можно конечно наделать разных вариантов, сейчас есть около 4, плюс всякие вариации на тему, но хотел не велосипедить, а узнать может кто сталкивался. Типа "когда запросы подобной сложности и кол-во данных тоже много, то надо копать в elasticsearch/postgres/mongo/erlang/алгоритмы", или вообще комбинация "Простые запросы правильно в бд, потом парареллить фильтрацию в коде", мол best practice и все такое.
Скрипт способен на текущей момент выполняться до 2 минут. Это можно сказать сердце сервиса, потому вызывается часто. Вызывается для конкретного пользователя. Распараллелить не плохо звучит. Но я так понял, вы за вариант решения задачи непосредственно в коде?
Как один из вариантов. А это не противоречит ответственности "слоев"? Например, код - бизнес-логика, а база - хранение и фильтрация/сортировка/etc данных. Получается часть задач базы на себя берет код, тем самым мы признаем что наше хранилище не способно совершать подобного рода запросы. Может тогда хранилище не то? Не холивара ради, а понимания для) За динамическое программирование спасибо, ща буду изучать!
В целом вы правы. Даты загоняются в DateTime, но получается что их там 300000+(дальше будет больше 10000000), где надо еще каждый подравнять и найти пересечения, все отсортировать, а потом сгрупировать. С другой стороны было бы возможно хранить прямо ts и вычислять исключительно математически без создания лишних объектов, по факту получается, но также нужно исключить выходные дни и тут без преобразования в DateTime я уже не обойдусь. Кешировать получиться малую часть, запросы хоть и похожие, но исходные данные постоянно меняются, т.к. сам запрос меняет эти данные, выигрыш будет, но не большой + будет повышенное потребление памяти. Узкие места знаю где, их довольно много, и решение каждого будет напоминать затыкание дыр тонущего корабля) Потому и вопрос поднялся. Возможно я просто взял неподходящий инструмент.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.