Есть индекс по orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?

AИндекс «ломается» при любом использовании WHERE со столбцом created_at в условии фильтрации
BФункция date(created_at) меняет выражение, и индекс по created_at не может использоваться напрямую
CEXPLAIN всегда показывает Seq Scan для условий с равенством, даже когда индекс реально применяется
DУсловие = в WHERE отключает использование индексов в большинстве реляционных СУБД по умолчанию
Правильный ответ. Индекс чаще используется, когда в WHERE сравнивается сам столбец, а не результат функции от него.

Разбор

Когда вы пишете date(created_at), база должна вычислить дату для каждой строки, и обычный индекс по created_at становится мало полезен. Часто запрос переписывают в виде диапазона по времени, например created_at >= current_date AND created_at < current_date + interval '1 day'. Тогда условие становится «индексируемым», и шанс увидеть Index Scan выше. Альтернатива — функциональный индекс CREATE INDEX ... ON orders (date(created_at)), но это лишние накладные расходы на запись.

Проверь себя · 1/3разбор после ответа
Есть индекс по orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?
Тренировать SQL в Telegram

Ещё вопросы по теме «EXPLAIN и оптимизация»