Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 10 · Exercice de TD
Un index pour le rayon
PostgreSQL et les migrations · niveau 2
Énoncé
Le plan de la recherche par rayon est, aujourd'hui :
QUERY PLAN
---------------------------------------------------------
Seq Scan on livre (cost=0.00..10.88 rows=1 width=1035)
Filter: ((rayon)::text = 'Littérature'::text)
(2 rows)
Ajouter un index sur le rayon par une migration, et montrer que PostgreSQL sait s'en servir.
Corrigé
-- Exercice 10.4 : la recherche par rayon n'a plus à lire toute la table.
create index livre_rayon on livre (rayon);
Avec six livres, lire la table entière reste moins cher que passer par l'index, et PostgreSQL continue de la lire en entier. Pour vérifier que l'index est utilisable, le test simule une grande table en interdisant la lecture séquentielle, puis affiche le plan :
@Test
void lIndexExisteEtSertQuandLaTableEstGrande() {
assertThat(jdbc.queryForList("select indexname from pg_indexes where tablename = 'livre'", String.class))
.contains("livre_pkey", "livre_rayon");
jdbc.execute("set enable_seqscan = off"); // simule une grande table
jdbc.queryForList("explain select * from livre where rayon = 'Littérature'", String.class)
.forEach(ligne -> System.out.println("PLAN | " + ligne));
}
PLAN | Index Scan using livre_rayon on livre (cost=0.13..8.15 rows=1 width=1253)
PLAN | Index Cond: ((rayon)::text = 'Littérature'::text)100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.