Да, это сводится к тому, что называется «селективностью» предиката (предложение «где ...»).
Если предикат выбирает только небольшую часть строк в таблице, имеет смысл извлекать каждую из них по отдельности с произвольно упорядоченным доступом к данным таблицы, поскольку будет выбрано только несколько страниц.
По мере увеличения количества выбираемых строк растровое сканирование становится более подходящим: индекс используется для определения того, какие страницы в таблице являются «интересными», а затем эти страницы сканируются в порядке их размещения в файл данных таблицы. Это имеет то преимущество, что смежные страницы могут запрашиваться вместе, что, вероятно, будет гораздо более эффективно обслуживаться файловой системой / дисковой системой. (Конечно, это зависит от того, что файл табличных данных достаточно не фрагментирован). Поскольку набор реальных интересных кортежей на каждой странице не сохраняется, а только набор самих страниц, предикат должен быть переоценен для каждого кортежа на найденных страницах: отсюда и «reheck cond» в запросе. (Одним из преимуществ этой стратегии является то, что она позволяет объединять поиски в нескольких независимых индексах, просто добавляя (или ORing) вместе растровые изображения «интересных страниц» из нескольких поисков по индексам)
По мере того, как число строк, которые нужно выбрать, еще больше возрастает, преимущество сканирования индекса уменьшается, поскольку вероятный результат состоит в том, что большая часть таблицы будет помечена как "интересная". Таким образом, в конечном итоге становится целесообразным простое последовательное сканирование: все страницы проходят по порядку, а индекс игнорируется.
IIRC позволяет понять, что запрос менее 15% таблицы, скорее всего, является сканированием индекса, 15-50% сканированием растрового изображения, 50% + сканированием последовательности. Очень грубо На это сильно влияют относительные настройки random_page_cost и seq_page_cost, среди прочих (например ,ffective_cache_size).
Postgresql собирает статистику об общих значениях и их частотах, а также гистограммы других значений для каждого столбца в базе данных - это используется для оценки селективности и заполняет оценку «строк», которую вы видели в выводе EXPLAIN. Документация содержит описание того, как это делается: http://www.postgresql.org/docs/current/static/planner-stats-details.html