Я знаю два сильных пути оптимизации в БД.
1)
Минимизация IOps. Тоесть уменшить число дисковых чтений. Для таблиц это достигается через
partitions by date. Вычисляешь экспериментально оптимальный размер partition (например 1 неделя).
И твои запросы по диапазону должны попадать в 1-2 partitions. Это исключает full-table-scan.
Ну и индекс попробуй построить по предикатам фильтров.
2)
Материализация ответов. Для данных которые уже не будут изменяться ты строишь где-то такую
табличку (матрицу по сути) где хранишь уже заранее расчитанные данные. Эта технология по разному
может называться.
Materialized View. OLAP cubes. Витрины данных. Но суть одна.
start_date end_date result
01-02-2023 03-02-2023 { "1":"65", "2":"45" }
И индекс по двум датам.