Parcours séquentiel
Qu’est-ce qu’un parcours séquentiel (Seq Scan) dans PostgreSQL ?
Un parcours séquentiel lit chaque ligne d’une table du début à la fin. EXPLAIN l’affiche sous le nom Seq Scan ; c’est le choix normal pour les petites tables ou les requêtes qui renvoient beaucoup de lignes.
Un parcours séquentiel (Seq Scan dans la sortie d’EXPLAIN) lit toutes les pages d’une table dans l’ordre et vérifie chaque ligne par rapport aux conditions de la requête. Il ne nécessite aucun index, et c’est la solution de repli du planificateur lorsqu’aucun index exploitable n’existe.
Un Seq Scan n’est pas forcément un problème. Pour les petites tables, ou lorsqu’une requête renvoie une grande part des lignes, lire toute la table peut coûter moins cher que d’aller et venir entre un index et la table. Il devient préoccupant lorsqu’une grande table est lue en entier pour renvoyer une poignée de lignes ; un index sur la colonne filtrée règle généralement le problème. Le planificateur décide en fonction des statistiques de la table : exécutez donc ANALYZE après avoir chargé beaucoup de données.
Exemple
L’exemple charge 100 000 lignes, collecte les statistiques avec ANALYZE et demande à EXPLAIN comment PostgreSQL filtrerait sur une colonne sans index. La sortie affiche Seq Scan on events.
CREATE TABLE events (id int, kind text);
INSERT INTO events
SELECT g, 'k' || (g % 10) FROM generate_series(1, 100000) AS g;
ANALYZE events;
EXPLAIN SELECT * FROM events WHERE kind = 'k3';Du SQL simple pour PostgreSQL 16 ou 17 standard, sans aucune extension. Exécutez-le dans une base de données vide que vous pouvez jeter ensuite.
Références
Documentation officielle de PostgreSQL (en anglais).