Индекс на числовое поле в таблице с несколькими млн записей

Здравствуйте!
Имеется таблица с несколькими миллионами записей, в которой есть поле типа INTEGER, на это поле стоит индекс.
Если в условии к запросу подставлять граничные значения этого поля, то индекс используется, если в поставить примерно среднее значение, то не используется.
Пример (допустим максимальное значение поля id=1000000, минимальное - 1):
SELECT id from t where id=1; // индекс используется
SELECT id from t where id=1000000; // индекс используется
SELECT id from t where id=555555; // индекс НЕ используется

Подскажите, пожалуйста, каким образом можно заставить постгрес использовать индекс всегда?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

VACUUM ANALYZE на таблицу

VACUUM ANALYZE
на таблицу делали?
Возможно имеет смысл подумать о разделении таблицы на подтаблицы для улучшения производительности.
Ещё, попробовать создать индексы с явным указанием типа индекса

В общем много чего можно попробовать сделать.

VACUUM ANALYZE делал и VACUUM

VACUUM ANALYZE делал и VACUUM FULL ANALYZE тоже.
Разделять таблицу пока не хочется, это крайний случай. Хотелось бы понять почему не используется индекс.
Попробовал сейчас сделать индекс с указанием явного типа, все то же самое.
Кстати, если сделать перед запросом set enable_seqscan = off; , то запрос выполняется гораздо быстрее с индексом.
Почему же постгрес его не хочет использовать не могу понять пока.

По всей видимости,

По всей видимости, оптимизатор думает, что без индекса будет быстрее.
Надо как-то убедить его, что он не прав.
Конкретного совета дать не могу, потому как у меня нет вашей БД и мне не на чем ставить эксперименты

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023