Почему вы не используете JOIN? А ты АНАЛИЗИРУЛ? Как насчет статистики? Проверьте pg_stats для этой таблицы, чтобы получить больше информации. reltuples и relpages в pg_class также интересны для таблицы и ее индексов.
Edit:
JOIN ожидает 228639 строк. При последовательном сканировании ожидается 303733 строки, только дополнительная доля. Когда эти 100k записей повсюду, база данных все равно должна сканировать реляционные страницы. Последовательное сканирование будет быстрее, чем сканирование индекса, последовательное сканирование (быстрое) чтение последовательного хвоста, сканирование индекса будет двумя (!) Медленными случайными чтениями: информация из индекса и данные из таблица.
Если вы считаете, что план неправильный, АНАЛИЗИРУЙТЕ таблицу и покажите нам информацию из таблиц и индексов из pg_stats и pg_class.
ANALYZE;
SELECT relpage, reltuples WHERE relname = 'table_or_index_name';
SELECT * FROM pg_stats WHERE tablename = 'name of your table';