Postgres не использует индекс с "ORDER BY" - PullRequest
6 голосов
/ 19 ноября 2010
  • У меня очень большая таблица.
  • У меня есть индекс по столбцам col1.
  • Я хотел бы получить данные, упорядоченные по col1.
  • Из плана запроса я могу сказать, что он не использует индекс.
  • Когда я добавляю «LIMIT», он начинает использовать индекс
  • Для большого значения «LIMIT» он останавливаетсяиспользуя индекс.

Любая подсказка?

PS Я хотел бы получить данные, кластеризованные по значениям col1 (необязательно отсортированным), любые предложения, кроме "ORDER BY".

СПАСИБО !!

Ответы [ 2 ]

6 голосов
/ 19 ноября 2010

Если вы вернете все строки из таблицы, сканирование индекса будет медленнее, чем сканирование таблицы. Как вы думаете, зачем вам нужен индекс?

Вы можете попробовать использовать

set enable_seqscan = false

чтобы отключить последовательное сканирование, но я уверен, что оно будет медленнее, чем при последовательном сканировании.

ORDER BY - это only метод сортировки ваших данных. Любая другая сортировка, которую вы можете увидеть, является чистым совпадением

Редактировать
Чтобы прояснить ситуацию: я не рекомендую отключить seq scan. Я только что опубликовал это как способ показать, что сканирование seq действительно быстрее, чем сканирование индекса. После отключения плана выполнения с использованием сканирования индекса, скорее всего, будет медленнее, чем сканирование seq, показывающее OP, что сканирование индекса не требуется.

4 голосов
/ 19 ноября 2010

В дополнение к ответу a_horse_with_no_name:

Использование индекса - это на самом деле две различные операции: во-первых, в индексе ищется нужное вам значение.В индексе указывается адрес полной записи, которая затем разыменовывается.Обе операции выполняются очень быстро для определенных запросов.

Если вы все равно намереваетесь использовать все или большинство записей, выгода исчезнет.Если вам нужны все записи и вы проходите через индекс, это занимает больше времени, потому что для каждой записи есть два поиска.Проще всего пройти по всей таблице без индекса, так как для этого требуется один запрос на столбец (да, я знаю, на самом деле это меньше, потому что целые блоки читаются и т. Д. Я просто хочу сделать это простым).*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...