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

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

Разбор

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

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

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