Page 1 sur 1

Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 6:07 am
par marie
Besoin d'aide sur une requête PostgreSQL qui prend 12 secondes à s'exécuter. J'ai 5 LEFT JOIN sur des tables de 100k à 1M d'entrées. EXPLAIN montre qu'il fait des seq scan sur certaines tables malgré les indexes. Des idées ?

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 8:07 am
par david.l
As-tu vérifié si tes statistiques sont à jour avec ANALYZE ? Aussi, parfois PostgreSQL préfère un seq scan si tu récupères une grande partie de la table. Essaye de limiter les colonnes sélectionnées.

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 9:07 am
par admin_sys_gaming
12 secondes c'est effectivement beaucoup. Tu pourrais partager ton plan d'exécution ? Peut-être qu'un CTE ou un réécriture avec des sous-requêtes pourrait aider.

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 1:07 pm
par marie
Voici un extrait du EXPLAIN : il fait des scans séquentiels sur table1 et table3 alors qu'il y a des indexes. J'ai fait un ANALYZE hier. Voici la structure des JOIN... [détails techniques]

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 4:07 pm
par kernelpanic59
D'après ce que je vois, ton problème vient probablement des cardinalités estimées. Essaye d'augmenter work_mem temporairement pour voir si le planner fait un meilleur choix. Sinon, des hints avec pg_hint_plan ?

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 6:07 pm
par david.l
Autre piste : as-tu essayé de réécrire en utilisant des INNER JOIN là où c'est possible ? Les LEFT JOIN sont souvent mal optimisés quand ils ne sont pas vraiment nécessaires.

Re: Optimisation d'une requête SQL avec plusieurs LEFT JOIN qui rame

Publié : ven. août 01, 2025 7:07 pm
par marie
Merci à tous ! Augmenter work_mem a déjà divisé le temps par 3. Je vais tester de remplacer deux LEFT JOIN par des INNER comme suggéré et voir l'impact.