Почему PostgreSQL выполняет последовательное сканирование индексированного столбца?

очень простой пример - одна таблица, один индекс, один запрос:

CREATE TABLE book
(
  id bigserial NOT NULL,
  "year" integer,
  -- other columns...
);

CREATE INDEX book_year_idx ON book (year)

EXPLAIN
 SELECT *
   FROM book b
  WHERE b.year > 2009

дает мне:

Seq Scan on book b  (cost=0.00..25663.80 rows=105425 width=622)
  Filter: (year > 2009)

почему он не выполняет сканирование индекса вместо этого? Что я упускаю?

2 ответов


Если SELECT возвращает более 5-10% всех строк таблицы, последовательное сканирование выполняется намного быстрее, чем сканирование индекса.

Это потому, что сканирование индекса требует несколько операции ввода-вывода для каждой строки (найдите строку в индексе, затем извлеките строку из кучи). В то время как последовательное сканирование требует только одного ввода-вывода для каждой строки - или даже меньше, потому что блок (страница) на диске содержит более одной строки, поэтому можно получить более одной строки с помощью одной операции ввода-вывода.

Btw: это верно и для других СУБД - некоторые оптимизации, такие как" сканирование только индекса", отложены (но для SELECT * маловероятно, что такая СУБД пойдет на"сканирование только индекса")


ты анализировать таблицы/базы данных? А как насчет статистика? Когда есть много записей, где год > 2009, последовательное сканирование может быть быстрее, чем сканирование индекса.