Optimisation d'une requête SQL sous PostgreSQL
Optimisation d'une requête SQL sous PostgreSQL
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
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
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'
-
romain1995
- Messages : 43
- Inscription : ven. mai 17, 2024 7:24 pm
Re: Optimisation d'une requête SQL sous PostgreSQL
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
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
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.