Page 1 sur 1
Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 12:32 am
par vincent.d
J'ai une requête qui prend 12s sur une table avec 2M de lignes. EXPLAIN montre un seq scan mais j'ai bien un index sur le champ 'user_id'. Pourquoi il l'utilise pas ?
Re: Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 1:32 am
par mehdi2001
PostgreSQL ignore parfois les indexes si il estime que ça sera moins performant. Tu peux forcer avec SET enable_seqscan = OFF mais c'est pas idéal. Montre nous ton schéma et ta requête exacte.
Re: Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 3:32 am
par vincent.d
Voici le schéma : CREATE TABLE events (id bigserial, user_id bigint, created_at timestamp, ...). Index : CREATE INDEX idx_user ON events(user_id). Requête : SELECT * FROM events WHERE user_id = 1234 AND created_at > NOW() - INTERVAL '30 days'
Re: Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 4:32 am
par romain1995
Le problème c'est ton AND. Crée un index composite : CREATE INDEX idx_user_created ON events(user_id, created_at). Là le planner utilisera forcément l'index. Teste et reviens nous dire !
Re: Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 7:32 am
par vincent.d
Merci ! J'ai testé l'index composite et la requête descend à 0.2s. Par contre l'index fait 450Mo maintenant... Vous pensez que c'est raisonnable pour 2M de lignes ?
Re: Optimisation d'une requête SQL sous PostgreSQL
Publié : mer. mai 07, 2025 12:32 pm
par mehdi2001
450Mo c'est correct. Si tu veux optimiser plus, regarde du côté des index partiels (WHERE user_id IS NOT NULL) ou des index BRIN pour les timestamps.