Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

MySQL, PostgreSQL, requetes, optimisation
jojo1998
Messages : 215
Inscription : dim. juin 15, 2025 7:24 pm

Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

Message par jojo1998 »

Bonjour, j'ai une table avec 8M de lignes (PostgreSQL 14). Un simple COUNT(*) prend 30 secondes ! L'index est présent sur l'ID, EXPLAIN montre un seq scan. Comment forcer l'utilisation de l'index ?
admin_sys_gaming
Messages : 571
Inscription : sam. janv. 20, 2024 7:24 pm

Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

Message par admin_sys_gaming »

COUNT(*) fera toujours un seq scan, c'est normal. Les indexes ne stockent pas les NULL donc PostgreSQL doit parcourir toute la table. Solution : créer une table de métriques ou utiliser COUNT(id) si la colonne est not null.
jojo1998
Messages : 215
Inscription : dim. juin 15, 2025 7:24 pm

Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

Message par jojo1998 »

Merci, mais COUNT(id) prend aussi 28 secondes... La table est pourtant simple : un id bigserial, un timestamp et 3 varchar. Pas de triggers ni de FKs.
seb33
Messages : 101
Inscription : mar. août 26, 2025 7:25 pm

Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

Message par seb33 »

As-tu vérifié la vacuum ? Avec 8M de lignes, si autovacuum a du retard, les statistiques seront faussées. Fais un VACUUM ANALYZE manuel et teste à nouveau. Sur mon serveur avec NVMe, même requête prend 1,2s après un bon vacuum.
Le cloud c'est l'ordi de quelqu'un d'autre
jojo1998
Messages : 215
Inscription : dim. juin 15, 2025 7:24 pm

Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)

Message par jojo1998 »

Effectivement, le VACUUM ANALYZE a fait passer le COUNT à 4s ! Mais c'est encore trop pour mon use case. Je vais peut-être implémenter un compteur incrémental comme suggéré.
Répondre