Exemple très simple - une table, un index, une requête:
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
Donne moi:
Seq Scan on book b (cost=0.00..25663.80 rows=105425 width=622)
Filter: (year > 2009)
Pourquoi n'effectue-t-il PAS d'analyse d'index à la place? Qu'est-ce que je rate?
la source
Avez-vous ANALYSÉ la table / la base de données? Et qu'en est-il des statistiques ? Lorsqu'il existe de nombreux enregistrements dont l'année> 2009, une analyse séquentielle peut être plus rapide qu'une analyse d'index.
la source
Dans le balayage d'index, la tête de lecture saute d'une ligne à l'autre, ce qui est 1000 fois plus lent que la lecture du bloc physique suivant (dans le balayage séquentiel).
Ainsi, si le (nombre d'enregistrements à récupérer * 1000) est inférieur au nombre total d'enregistrements, l'analyse d'index fonctionnera mieux.
la source
@a_horse_with_no_name l'a assez bien expliqué. De plus, si vous souhaitez vraiment utiliser une analyse d'index, vous devez généralement utiliser des plages limitées dans la clause where. par exemple - année> 2019 et année <2020.
La plupart du temps, les statistiques ne sont pas mises à jour sur une table et il peut ne pas être possible de le faire en raison de contraintes. Dans ce cas, l'optimiseur ne saura pas combien de lignes il devrait prendre en année> 2019. Ainsi, il sélectionne une analyse séquentielle au lieu d'une connaissance complète. Les partitions délimitées résoudront le problème la plupart du temps.
la source