Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)
Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)
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(*)
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.
Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)
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.
Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)
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
Re: Optimisation requête PostgreSQL : 30 secondes pour un simple COUNT(*)
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é.