PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Boucles imbriquées PostgresSQL - Quand le planificateur décide-t-il d'utiliser la boucle imbriquée lors d'une INNER JOIN ?

Le planificateur ne décide pas d'utiliser une certaine stratégie de jointure basée sur un raisonnement approfondi, il construit simplement toutes les stratégies de jointure possibles, estime le coût et choisit la moins chère.

Cela dit, les jointures de boucles imbriquées sont généralement le meilleur choix si la table externe est petite, de sorte que la boucle interne n'a pas à être exécutée souvent. De plus, un index sur la condition de jointure de la table interne peut réduire considérablement le coût d'une jointure de boucle imbriquée et en faire une stratégie attrayante.

Dans votre cas, le mauvais choix est dû à une mauvaise estimation :

Foreign Scan on wind_forecast_recent w  (cost=... rows=1 ...) (actual ... rows=7 ...)

Cela entraîne l'exécution de la boucle interne 7 fois au lieu d'une fois, de sorte que le temps d'exécution est de 70 secondes au lieu de 10.

Vous devez collecter des statistiques de table sur wind_forecast_recent :

ANALYZE wind_forecast_recent;

N'oubliez pas que l'analyse automatique ne fait pas traiter les tables étrangères; vous devez vous en occuper vous-même.

Si cela ne fonctionne pas, vous pouvez essayer de définir le use_remote_estimate sur la table étrangère et assurez-vous que les statistiques de la table sont exactes sur la base de données distante.