Вы пробовали Покрытие индексов , чтобы оптимизатор использовал индекс, а не выполнял последовательное сканирование?
create index covering on rollup_day(tenant_id, created_date, search_keyword, users, sessions, total);
Если Postgres 11
create index covering on rollup_day(tenant_id, created_date) INCLUDE (search_keyword, users, sessions, total);
Но так как вы также делаете сортировку / группирование по search_keyword
, возможно:
create index covering on rollup_day(tenant_id, created_date, search_keyword);
create index covering on rollup_day(tenant_id, search_keyword, created_date);
Или:
create index covering on rollup_day(tenant_id, created_date, search_keyword) INCLUDE (users, sessions, total);
create index covering on rollup_day(tenant_id, search_keyword, created_date) INCLUDE (users, sessions, total);
Один из этих индексов должен ускорить запрос. Вы должны добавить только один из этих индексов.
Даже если это ускоряет этот запрос, наличие больших индексов будет / может замедлить ваши операции записи (особенно обновления HOT недоступны для индексированных столбцов ). И вы будете использовать больше памяти.