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 a verificação de índice? o que estou perdendo?
fonte
Você analisou a tabela / banco de dados? E as estatísticas ? Quando existem muitos registros em que ano> 2009, uma varredura seqüencial pode ser mais rápida que uma varredura de índice.
fonte
Na varredura de índice, a cabeça de leitura salta de uma linha para outra 1000 vezes mais lenta que a leitura do próximo bloco físico (na varredura seqüencial).
Portanto, se o (número de registros a serem recuperados * 1000) for menor que o número total de registros, a verificação do índice funcionará melhor.
fonte
@a_horse_with_no_name explicou muito bem. Além disso, se você realmente deseja usar uma varredura de índice, geralmente deve usar intervalos limitados na cláusula where. por exemplo - ano> 2019 e ano <2020.
Muitas vezes as estatísticas não são atualizadas em uma tabela e pode não ser possível devido a restrições. Nesse caso, o otimizador não saberá quantas linhas deve levar no ano> 2019. Assim, ele seleciona uma varredura seqüencial em vez de conhecimento completo. Partições limitadas resolverão o problema na maioria das vezes.
fonte