Когда отчёты считаются минутами, а данные почти не меняются, решение может быть в кэшировании результата.
Используй материализованное представление (как
VIEW, но результат хранится физически в таблице):CREATE MATERIALIZED VIEW daily_stats AS
SELECT date(created_at) AS day,
COUNT(*) AS total_orders
FROM orders
GROUP BY 1;
CREATE UNIQUE INDEX ON daily_stats(day); -- нужно для CONCURRENTLY
Обновлять можно вручную или по расписанию (
cron, pg_cron):REFRESH MATERIALIZED VIEW_stats;
А если нужно без блокировок чтения:
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_stats;
🔥 Помни:
concurrently медленнее и требует индекс, но позволяет читать данные во время обновления.➡️ SQL Ready | #совет
