PostgreSQL индексы не используются почему и как починить

Рейтинг: 35.9% · 7 голосов
SQL и NoSQL: PostgreSQL, MySQL, Redis, MongoDB, ClickHouse, ElasticSearch — проектирование схем, индексы, репликация и оптимизация запросов.
Ответить
Аватара пользователя
icu2
Сообщения: 65
Зарегистрирован: 14 май 2026, 06:04

PostgreSQL индексы не используются почему и как починить

Сообщение icu2 »

Есть таблица orders на ~50 млн строк, на колонке status есть btree-индекс. Делаю простой SELECT * FROM orders WHERE status = 'pending' — и EXPLAIN ANALYZE показывает Seq Scan, индекс вообще не трогается. Версия PostgreSQL 15.3. Что я делаю не так и как заставить планировщик использовать индекс?
👍1 ❤️1 🔥2 😄1 🤔1
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — solidity2024
Развёрнуто по теме: pg_stats это твой друг. Запрос SELECT n_distinct, correlation FROM pg_stats WHERE tablename = 'orders' AND attname = 'status' покажет, сколько уникальных значений видит планировщик и насколько физически отсортированы данные. Если n_distinct маленький (например, 5 статусов), а одно значение занимает 40%+ строк — это объясняет seq scan. Решения: 1) Для колонок с малым…
Перейти к ответу →
Аватара пользователя
Kireeich
Сообщения: 20
Зарегистрирован: 14 май 2026, 10:49

Re: PostgreSQL индексы не используются почему и как починить

Сообщение Kireeich »

Первым делом смотри на селективность. Если у тебя 'pending' это 40% строк — планировщик совершенно справедливо решит, что дешевле сканировать всю таблицу, чем скакать по индексу. Индексы хорошо работают, когда ты достаёшь малый процент строк, обычно это до 5-10%.
👍2 ❤️2 🔥2 😄1 🤔1
Аватара пользователя
peekatwo
Сообщения: 38
Зарегистрирован: 12 май 2026, 03:30

Re: PostgreSQL индексы не используются почему и как починить

Сообщение peekatwo »

Ещё классика: статистика устарела. Запусти ANALYZE orders и повтори EXPLAIN. Если давно не делали autovacuum или таблица сильно менялась, планировщик может жить в иллюзиях о распределении данных.
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
gdgdgd
Сообщения: 77
Зарегистрирован: 11 май 2026, 03:27

Re: PostgreSQL индексы не используются почему и как починить

Сообщение gdgdgd »

Проверь параметр enable_seqscan — надеюсь, он не выключен где-то в конфиге ради «ускорения». Видел такое у людей, которые нагуглили совет без понимания. Для диагностики можно SET enable_seqscan = off локально в сессии, посмотреть стоимость плана с индексом — если она выше seq scan, то планировщик прав.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
solidity2024
Сообщения: 40
Зарегистрирован: 11 май 2026, 02:34

Re: PostgreSQL индексы не используются почему и как починить

Сообщение solidity2024 »

✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Развёрнуто по теме: 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 индексы не используются почему и как починить

Сообщение kernelpilot »

Кстати, если делаешь SELECT *, то даже при хорошем индексе Postgres иногда предпочтёт seq scan, потому что index scan + heap fetch дороже, чем просто пройтись по таблице с bitmap. Попробуй выбирать только нужные колонки — иногда это меняет план.
👍1 ❤️ 🔥1 😄1 🤔1
Аватара пользователя
asynclover
Сообщения: 70
Зарегистрирован: 13 май 2026, 04:35

Re: PostgreSQL индексы не используются почему и как починить

Сообщение asynclover »

Покажи вывод EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) — без этого гадаем на кофейной гуще. Особенно интересны строки Rows Removed by Filter и actual rows vs estimated rows.
👍2 ❤️1 🔥1 😄3 🤔
Ответить
Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое postgresql простыми словамибаза данных postgresql для начинающихsql запросы в postgresql для начинающихпочему postgresql медленный и как ускоритьчастичный и покрывающий индекс в postgresql когда нуженjsonb в postgresql операторы и индексация

Вернуться в «Базы данных»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость