Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: query, planner

Почему PostgreSQL может не использовать индекс и предпочесть Seq Scan?

Вопрос проверяет понимание того, как PostgreSQL выбирает план выполнения запроса и оценивает его стоимость.

Короткий ответ

PostgreSQL выбирает план выполнения на основе оценки стоимости, а не наличия индекса. Если планировщик считает, что последовательное сканирование будет дешевле, он выберет Seq Scan. Это часто происходит при выборке большого процента строк. Также причиной могут быть устаревшие статистики или неподходящий тип индекса.

Длинный ответ

Важно понимать, что PostgreSQL не обязан использовать индекс, даже если он существует.

Как PostgreSQL выбирает план

Планировщик оценивает несколько вариантов выполнения запроса и выбирает самый дешевый по внутренней модели стоимости.

  • стоимость чтения страниц с диска

  • количество ожидаемых строк

  • сложность операций

Основные причины выбора Seq Scan

  1. Выбирается много строк

    • Если запрос возвращает большую часть таблицы, индекс теряет смысл

    • Последовательное чтение дешевле множества случайных обращений

  2. Устаревшая статистика

    • PostgreSQL неправильно оценивает количество строк

    • Планировщик принимает неверное решение

  3. Тип условия

    • Используются функции или выражения над колонкой

    • Индекс не может быть применен

SELECT *
FROM users
WHERE LOWER(email) = 'test@mail.com';
-- обычный индекс по email здесь не используется
  1. Низкая селективность

    • В колонке много одинаковых значений

    • Индекс плохо фильтрует данные

Как повлиять на выбор плана

  • обновить статистику через ANALYZE

  • создать подходящий индекс

  • переписать условие запроса

  • использовать функциональный индекс при необходимости

Краткий вывод

PostgreSQL выбирает Seq Scan, когда считает его более дешевым, и это чаще связано с объемом данных, статистикой и селективностью условий.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

Ключевые слова

#query

#planner

Подпишись на Java Developer в телеграм