Compter exactement des lignes avec COUNT(*)
Tu consultes pg_stat_user_tables pour vérifier le chargement d'une table. La
colonne n_live_tup ressemble à un nombre de lignes, mais PostgreSQL ne parcourt
pas la table pour la produire. Peut-on reprendre ce nombre dans une note de
contrôle qualité ?
Cette fiche travaille le contrôle des données avec SQL, une compétence du bloc BC01.
| Ton besoin | Où travailler |
|---|---|
| Distinguer estimation et comptage | Sections 1 et 2 |
| Choisir la mesure adaptée | Section 3 |
1. Comparer les deux nombres
Exécute cette requête sans présenter encore la valeur comme un comptage :
SELECT relname AS nom_table,
n_live_tup AS estimation
FROM pg_stat_user_tables
WHERE relname = 'products';Avant de continuer, écris ce que PostgreSQL a dû faire pour obtenir ce nombre.
A-t-il parcouru les lignes de products au moment de ta requête ?
Compare maintenant avec un comptage sur toute la même table, sans filtre :
SELECT COUNT(*) AS nombre_lignes
FROM products;Note les deux valeurs avec leur provenance. COUNT(*) compte les lignes
visibles par cette requête. n_live_tup est une estimation issue des statistiques
de suivi de l’activité de PostgreSQL, pas un comptage lancé par ta requête.
Et les estimations utilisées pour préparer une requête ?
Pour choisir comment exécuter une requête, PostgreSQL utilise notamment
reltuples dans pg_class. C’est une autre estimation, distincte de
n_live_tup. Pour ce contrôle qualité, retiens surtout la provenance du nombre
et utilise COUNT(*) quand tu dois annoncer un effectif exact.
Statistiques d’activité
et statistiques du planificateur.
Les deux valeurs peuvent être égales. Cette égalité ne transforme pas
n_live_tup en comptage : elle décrit seulement l'état actuel des statistiques.
2. Lire la provenance avant le nombre
Une estimation répond à « quelle taille dois-je prévoir ? ». Un comptage répond à « combien de lignes sont présentes maintenant ? ».
| Phrase à écrire | Mesure adaptée |
|---|---|
| Cette table contient exactement N lignes | COUNT(*) |
| Cette table semble petite ou volumineuse avant une analyse rapide | n_live_tup |
pg_stat_user_tables est une vue système, c'est-à-dire un résultat fourni par
PostgreSQL sur le fonctionnement de la base. La colonne n_live_tup peut évoluer
après des insertions, suppressions ou opérations de maintenance. Elle n'offre
pas la même garantie qu'un comptage exécuté sur les lignes visibles.
Teste maintenant la méthode exacte sur un sous-ensemble qui n'est pas demandé dans le TP : les produits dont le poids est absent. Ce nouveau comptage porte sur une partie de la table ; ne le compare pas à l’estimation de toute la table pour juger la précision de celle-ci.
SELECT COUNT(*) AS nombre_lignes
FROM products
WHERE product_weight_g IS NULL;Si ton résultat doit être vérifiable dans un livrable, garde cette requête avec la phrase qu'elle justifie.
3. Choisir et vérifier sur une autre table
Tu dois contrôler une table de ton choix. Procède en deux temps :
- écris la phrase que tu veux pouvoir affirmer ;
- choisis
n_live_tupouCOUNT(*), puis explique ce choix en commentaire SQL.
Si tu bloques, demande-toi si une approximation changerait la conclusion. Une note de nettoyage qui annonce un effectif demande un comptage exact.
Vérifie ensuite ta décision en exécutant les deux mesures sur la table choisie. Une différence confirme qu'elles ne répondent pas à la même exigence. Une égalité ne prouve pas qu'elles ont été calculées de la même façon.
-- Phrase à justifier : ...
SELECT COUNT(*) AS nombre_lignes
FROM nom_de_la_table;Pour le TP, utilise COUNT(*) lorsque tu annonces le nombre de lignes d'une
table. Le bac à sable n'affiche que 200 lignes au maximum, mais une requête de
comptage renvoie une seule ligne et mesure bien l'ensemble.