Вступить в клуб →
средняявопросPostgreSQL, JPA и производительность запросов

Составной индекс не помогает запросу по второй колонке

На таблице событий есть индекс:

CREATE INDEX idx_events_client_created ON events (client_id, created_at);

Отчёт выполняет запрос:

SELECT * FROM events
WHERE created_at >= now() - interval '1 day';

В плане запроса — Seq Scan по всей таблице. Почему индекс не используется?

  • Порядок колонок в составном индексе неважен, дело в типе колонки created_at и приведении типов в условии
  • Индекс подошёл бы, но планировщик работает по устаревшей статистике — достаточно выполнить ANALYZE на таблице
  • В условии нет ограничения по ведущей колонке client_id, а b-tree упорядочен сначала по ней — нужен индекс по created_at
  • Индекс заработает, если дописать в запрос ORDER BY client_id — тогда порядок совпадёт с порядком в индексе

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела