Есть несколько сторон ускорения работы запроса.
1. оптимизация железа
2. оптимизация базы данных
3. оптимизация самого запроса
1. Посмотреть загрузку жесткого диска во время вы полнения запроса через iostat -x 1
Если %util уперлась в 100% думать над ускорением дисковой подсистемы, возможно ставить raid-0
2. это обширная тема. Если вкратце надо разрешить базе использовать больше памяти во время выполнения запроса. См в сторону: shared_buffers, work_mem, maintenance_work_mem и статей по конфигурации postgresql
3. Смотрим сами индексы и порядок работы с ними. Возможно индексы в столбцах надо поменять с GiST на GIN (
www.postgresql.org/docs/9.1/static/textsearch-inde... Возможно надо сделать индексы по нескольким столбцам, чтобы констукция WHERE a AND b работала быстрее.
Еще если во время работы запроса делается одно и тоже действие по преобразованию данных, возможно надо сделать предобработку данных, чтобы это вычисление уже было готово (лежало в отдельном столбце) и потом по нему строить индекс и гонять выборку.
Гоняю запросы по данным мира в таблицах 100 млн записей. Сложные выборки обрабатываются меньше чем за секунду.