Por que o PostgreSQL executa a varredura seqüencial na coluna indexada?

Exemplo muito simples – uma tabela, um índice, uma consulta:

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 

me dá:

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

Por que NÃO realiza varredura de índice? o que estou perdendo?

Se o SELECT retornar mais de aproximadamente 5-10% de todas as linhas da tabela, uma varredura seqüencial será muito mais rápida que uma varredura de índice.

Isso ocorre porque uma varredura de índice requer várias operações de E / S para cada linha (procure a linha no índice e, em seguida, recupere a linha do heap). Enquanto uma varredura sequencial requer apenas um único IO para cada linha – ou até menos porque um bloco (página) no disco contém mais de uma linha, então mais de uma linha pode ser obtida com uma única operação IO.

Btw: isto também é válido para outros SGBDs – algumas otimizações como “scans apenas de índice” tomadas de lado (mas para um SELECT * é altamente improvável que um SGBD vá para uma “varredura apenas por índice”)

Você ANALISAR a tabela / database? E as statistics ? Quando há muitos registros em que ano> 2009, uma varredura sequencial pode ser mais rápida do que uma varredura de índice.