Если в вашей таблице действительно 250000 разных дней, вы, вероятно, не сможете добиться большего, чем этот.Однако увеличение work_mem
ускорит сортировку.
Если, однако, число различных дней значительно меньше, проблема заключается в том, что PostgreSQL не может оценить распределение результатов date_trunc
, если толькоВы создаете индекс:
CREATE INDEX ON test (date_trunc('day', updated_at));
Если updated_at
равен timestamp without time zone
, это будет работать нормально.Для timestamp with time zone
вам необходимо указать часовой пояс, поскольку в противном случае результат будет зависеть от часового пояса сеанса, что делает его непригодным для индекса:
CREATE INDEX ON test (date_trunc('day', updated_at AT TIME ZONE 'UTC'));
Тогда ANALYZE
в таблице, увеличьте work_mem
и посмотрите, сможете ли вы получить хэш-агрегат вместо сортировки.
Конечно, если вам нужно использовать AT TIME ZONE
в определении индекса, вам также придется использовать егов запросе ...