Вопрос проверяет понимание того, как PostgreSQL выбирает план выполнения запроса и оценивает его стоимость.
PostgreSQL выбирает план выполнения на основе оценки стоимости, а не наличия индекса. Если планировщик считает, что последовательное сканирование будет дешевле, он выберет Seq Scan. Это часто происходит при выборке большого процента строк. Также причиной могут быть устаревшие статистики или неподходящий тип индекса.
Важно понимать, что PostgreSQL не обязан использовать индекс, даже если он существует.
Планировщик оценивает несколько вариантов выполнения запроса и выбирает самый дешевый по внутренней модели стоимости.
стоимость чтения страниц с диска
количество ожидаемых строк
сложность операций
Выбирается много строк
Если запрос возвращает большую часть таблицы, индекс теряет смысл
Последовательное чтение дешевле множества случайных обращений
Устаревшая статистика
PostgreSQL неправильно оценивает количество строк
Планировщик принимает неверное решение
Тип условия
Используются функции или выражения над колонкой
Индекс не может быть применен
SELECT *
FROM users
WHERE LOWER(email) = 'test@mail.com';
-- обычный индекс по email здесь не используется
Низкая селективность
В колонке много одинаковых значений
Индекс плохо фильтрует данные
обновить статистику через ANALYZE
создать подходящий индекс
переписать условие запроса
использовать функциональный индекс при необходимости
PostgreSQL выбирает Seq Scan, когда считает его более дешевым, и это чаще связано с объемом данных, статистикой и селективностью условий.