В таблице orders есть индекс по status, но EXPLAIN для условия WHERE status IN ('paid','shipped') показывает Seq Scan. Какое объяснение наиболее правдоподобно, если эти статусы встречаются у большинства заказов?

AПланировщик ожидает, что в выборку попадёт много строк, и Seq Scan будет дешевле множества случайных чтений по индексу
BИндекс на колонке всегда игнорируется при использовании оператора IN с двумя и более значениями в условии
CПоявление Seq Scan указывает на то, что таблица заблокирована другим запросом и индекс временно недоступен
DИспользование Seq Scan означает, что индекс физически повреждён и его нужно пересоздать перед следующим запросом
Правильный ответ. Индекс не всегда выгоден: при выборке большой доли строк Seq Scan дешевле случайных обращений по индексу.

Разбор

Индекс эффективен, когда условие WHERE сильно сужает выборку. Если же фильтр пропускает большую долю строк, чтение через индекс превращается в множество случайных обращений к таблице и оказывается дороже последовательного сканирования. В этом случае планировщик выбирает Seq Scan, и это нормальное поведение, а не признак проблем. Утверждения про IN, блокировки и повреждение индекса — типичные мифы, не соответствующие тому, как принимается решение по плану.

Проверь себя · 1/3разбор после ответа
Есть индекс по orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?
Тренировать SQL в Telegram

Ещё вопросы по теме «EXPLAIN и оптимизация»