PostgreSQL индексы не используются почему и как починить
Рейтинг: 35.9% · 7 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
PostgreSQL индексы не используются почему и как починить
Есть таблица orders на ~50 млн строк, на колонке status есть btree-индекс. Делаю простой SELECT * FROM orders WHERE status = 'pending' — и EXPLAIN ANALYZE показывает Seq Scan, индекс вообще не трогается. Версия PostgreSQL 15.3. Что я делаю не так и как заставить планировщик использовать индекс?
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — solidity2024
Развёрнуто по теме: 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%.
Re: PostgreSQL индексы не используются почему и как починить
Проверь параметр enable_seqscan — надеюсь, он не выключен где-то в конфиге ради «ускорения». Видел такое у людей, которые нагуглили совет без понимания. Для диагностики можно SET enable_seqscan = off локально в сессии, посмотреть стоимость плана с индексом — если она выше seq scan, то планировщик прав.
- solidity2024
- Сообщения: 40
- Зарегистрирован: 11 май 2026, 02:34
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 обязателен.
- kernelpilot
- Сообщения: 24
- Зарегистрирован: 19 май 2026, 15:38
Re: PostgreSQL индексы не используются почему и как починить
Кстати, если делаешь SELECT *, то даже при хорошем индексе Postgres иногда предпочтёт seq scan, потому что index scan + heap fetch дороже, чем просто пройтись по таблице с bitmap. Попробуй выбирать только нужные колонки — иногда это меняет план.
- asynclover
- Сообщения: 70
- Зарегистрирован: 13 май 2026, 04:35
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
-
-
-
-
- Bloat в PostgreSQL убивает производительность — pg_repack или VACUUM FULL?
8 ответов · 80 просмотров
Похожие запросы:
что такое postgresql простыми словамибаза данных postgresql для начинающихsql запросы в postgresql для начинающихпочему postgresql медленный и как ускоритьчастичный и покрывающий индекс в postgresql когда нуженjsonb в postgresql операторы и индексация
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость