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