Почему 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, последовательное сканирование может быть быстрее, чем сканирование индекса.