Выключенный VACUUM и постоянные обновления мешают index-only scan в PostgreSQL

Дело в том, что index-only scan возможен только, если в Visibility Map установлен visibility флаг для искомых страниц. 

Флаг visibility устанавливается вакумом и означает, что в странице нет старых версий строк и нет никаких незакоммиченных новых. – т. е. страница целиком и полностью состоит из видимых версий строк. 

Соответственно visibility флаг снимается как только какая-либо транзакция начинает добавлять новые версии строк в страницу.

Поэтому для index-only scan недостаточно наличия одних только данных в индексе. Важно, чтобы страницы с данными были почищены от старых версий строк и никакие новые транзакции не работали с новыми версиями строк.