Здравствуйте!
Имеется таблица с несколькими миллионами записей, в которой есть поле типа 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; , то запрос выполняется гораздо быстрее с индексом.
Почему же постгрес его не хочет использовать не могу понять пока.
По всей видимости,
По всей видимости, оптимизатор думает, что без индекса будет быстрее.
Надо как-то убедить его, что он не прав.
Конкретного совета дать не могу, потому как у меня нет вашей БД и мне не на чем ставить эксперименты