Есть индекс по orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?
AИндекс «ломается», если использовать
WHERE.BФункция
date(created_at) меняет выражение, и индекс по created_at не может быть использован напрямую.C
EXPLAIN всегда показывает 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. Почему это часто происходит?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что дает запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает?
- В плане `EXPLAIN` для запроса по пользователю вы видите `Index Scan using orders_user_id_idx on orders`. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- В выводе `EXPLAIN` вы видите оценку `cost=0.00..431.00`. Какой вывод аналитик может сделать безопасно?
- Все вопросы по «EXPLAIN и оптимизация» →