Индекс по created_at есть, но запрос читает всю таблицу
PostgreSQL, таблица orders на 40 млн строк.
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT COUNT(*)
FROM orders
WHERE DATE(created_at) = '2026-03-01';
В плане выполнения — последовательное чтение всей таблицы, запрос идёт больше минуты. Что происходит и как это чинить?
- Индекс не успел построиться; нужно выполнить ANALYZE и повторить запрос
- Индекс по времени бесполезен для фильтра по дню, здесь помогает только партиционирование таблицы
- COUNT(*) всегда читает таблицу целиком, индексы на такой запрос не влияют
- Функция над столбцом делает обычный индекс неприменимым — нужен диапазон по created_at
