Для любого запроса, использование индекса зависит от стоимости использования этого индекса по сравнению с последовательным сканированием
Часто разработчики думают, что есть индекс, запрос должен работать быстрее, и если запрос выполняется медленно, индекс является решением. Обычно это происходит, когда запрос возвращает несколько кортежей. Но по мере увеличения количества кортежей в результате стоимость использования индекса может возрасти.
Вы используете postgres. Postgres не поддерживает кластеризацию по данному атрибуту. Это означает, что postgres, столкнувшись с запросом диапазона (типа att> a и att < b), должен вычислить оценку количества кортежей в результате (убедитесь, что вы часто удаляете свою базу данных) и стоимость использования индекс по сравнению с последовательным сканированием. он затем определит, какой метод использовать.
вы можете проверить это решение, запустив
EXPLAIN ANALYZE <query>;
в PSQL. Он скажет вам, использует ли он индекс или нет.
Если вы действительно хотите использовать индексы вместо последовательного сканирования (иногда это необходимо), и вы действительно действительно знаете, что вы делаете, вы можете изменить стоимость последовательного сканирования в константах планировщика или отключить последовательное сканирование в пользу любого другого метода. Смотрите эту страницу для деталей:
http://www.postgresql.org/docs/9.1/static/runtime-config-query.html
Убедитесь, что вы выберите правильную версию документации.
--dmg
Можете ли вы опубликовать план объяснения, общее количество строк и точное значение «очень медленно»? –
Пожалуйста, прочитайте http://stackoverflow.com/tags/postgresql-performance/info (и связанную страницу вики SlowQueryQuestions), затем обновите свой вопрос с помощью соответствующих результатов «объясните анализ» и сообщите об этом. Поскольку вы используете генератор запросов, вам может понадобиться использовать 'auto_explain' или регистрировать запросы и повторно выполнять их вручную. –
Пожалуйста, опубликуйте схему и тип запроса, который медленный. Вопрос, как он сформулирован, не может быть разумным ответом ... –