PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops – Wann entscheidet sich der Planer, Nested Loop bei einem INNER JOIN zu verwenden?

Der Planer entscheidet sich nicht für eine bestimmte Join-Strategie basierend auf tiefgehender Argumentation, er konstruiert einfach alle möglichen Join-Strategien, schätzt die Kosten und wählt die günstigste aus.

Allerdings sind Joins mit verschachtelten Schleifen normalerweise die beste Wahl, wenn die äußere Tabelle klein ist, damit die innere Schleife nicht oft ausgeführt werden muss. Außerdem kann ein Index für die Join-Bedingung der inneren Tabelle die Kosten eines Joins mit verschachtelten Schleifen erheblich reduzieren und ihn zu einer attraktiven Strategie machen.

In Ihrem Fall ist die schlechte Wahl auf eine Fehleinschätzung zurückzuführen:

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

Dadurch wird die innere Schleife 7 Mal statt nur einmal ausgeführt, sodass die Ausführungszeit 70 Sekunden statt 10 Sekunden beträgt.

Sie sollten Tabellenstatistiken zu wind_forecast_recent sammeln :

ANALYZE wind_forecast_recent;

Denken Sie daran, dass die automatische Analyse dies nicht tut ausländische Tische behandeln; darum musst du dich selbst kümmern.

Wenn das nicht hilft, können Sie versuchen, use_remote_estimate zu setzen Option für die Fremdtabelle und stellen Sie sicher, dass die Tabellenstatistiken in der entfernten Datenbank korrekt sind.