PostgreSQL индексы не используются почему и как починить
Рейтинг: 35.9% · 7 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- vitaly_quant
- Сообщения: 9
- Зарегистрирован: Сб май 16, 2026 3:36 am
PostgreSQL индексы не используются почему и как починить
Есть таблица orders на ~50 млн строк, на колонке status есть btree-индекс. Делаю простой SELECT * FROM orders WHERE status = 'pending' — и EXPLAIN ANALYZE показывает Seq Scan, индекс вообще не трогается. Версия PostgreSQL 15.3. Что я делаю не так и как заставить планировщик использовать индекс?
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — vlad_rust
Развёрнуто по теме: pg_stats это твой друг. Запрос SELECT n_distinct, correlation FROM pg_stats WHERE tablename = 'orders' AND attname = 'status' покажет, сколько уникальных значений видит планировщик и насколько физически отсортированы данные. Если n_distinct маленький (например, 5 статусов), а одно значение занимает 40%+ строк — это объясняет seq scan. Решения: 1) Для колонок с малым количество…
Re: PostgreSQL индексы не используются почему и как починить
Первым делом смотри на селективность. Если у тебя 'pending' это 40% строк — планировщик совершенно справедливо решит, что дешевле сканировать всю таблицу, чем скакать по индексу. Индексы хорошо работают, когда ты достаёшь малый процент строк, обычно это до 5-10%.
- clouddns1959
- Сообщения: 7
- Зарегистрирован: Пн май 11, 2026 10:27 am
Re: PostgreSQL индексы не используются почему и как починить
Проверь параметр enable_seqscan — надеюсь, он не выключен где-то в конфиге ради «ускорения». Видел такое у людей, которые нагуглили совет без понимания. Для диагностики можно SET enable_seqscan = off локально в сессии, посмотреть стоимость плана с индексом — если она выше seq scan, то планировщик прав.
Re: PostgreSQL индексы не используются почему и как починить
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Развёрнуто по теме: pg_stats это твой друг. Запрос SELECT n_distinct, correlation FROM pg_stats WHERE tablename = 'orders' AND attname = 'status' покажет, сколько уникальных значений видит планировщик и насколько физически отсортированы данные. Если n_distinct маленький (например, 5 статусов), а одно значение занимает 40%+ строк — это объясняет seq scan. Решения: 1) Для колонок с малым количеством уникальных значений попробуй partial index: CREATE INDEX idx_orders_pending ON orders (created_at) WHERE status = 'pending' — он будет маленьким и реально будет использоваться для pending-запросов. 2) Если нужен весь диапазон статусов — рассмотри секционирование по status. 3) Убедись что тип данных в запросе совпадает с типом колонки — неявный каст убивает индекс. 4) VACUUM ANALYZE после массовых UPDATE/DELETE обязателен.
- dnscache8196
- Сообщения: 32
- Зарегистрирован: Вс май 10, 2026 10:26 pm
Re: PostgreSQL индексы не используются почему и как починить
Кстати, если делаешь SELECT *, то даже при хорошем индексе Postgres иногда предпочтёт seq scan, потому что index scan + heap fetch дороже, чем просто пройтись по таблице с bitmap. Попробуй выбирать только нужные колонки — иногда это меняет план.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость