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

Индекс по колонке статуса не ускорил чтение и замедлил запись

Таблица payments содержит около 30 млн строк, в неё идёт интенсивная вставка. В колонке status три значения, причём примерно 95% строк имеют значение DONE.

Чтобы ускорить отчёт SELECT ... FROM payments WHERE status = 'DONE', добавили индекс по status. После выката отчёт быстрее не стал (в плане по-прежнему Seq Scan), а вставки заметно замедлились.

Что здесь произошло?

  • Индекс не используется, потому что после его создания не выполнили VACUUM FULL и таблица осталась раздутой
  • Под условие подходит 95% строк: индекс почти ничего не отсекает, поэтому планировщик выбирает Seq Scan, но поддерживать его при каждой вставке всё равно нужно
  • Индекс начнёт использоваться, если дописать в запрос ORDER BY status — тогда планировщик получит подходящий порядок чтения
  • Seq Scan в плане всегда означает ошибку конфигурации: планировщику не хватает памяти на индексное чтение
  • Замедление вставок вызвано не индексом, а блокировкой, которую удерживает отчёт при последовательном чтении таблицы

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

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

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

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