sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops - När bestämmer planeraren att använda Nested Loop när du gör en INNER JOIN?

Planeraren bestämmer sig inte för att använda en viss kopplingsstrategi baserat på djupa resonemang, den konstruerar helt enkelt alla möjliga kopplingsstrategier, uppskattar kostnaden och väljer den billigaste.

Som sagt, kapslade loop-kopplingar är vanligtvis det bästa valet om den yttre tabellen är liten, så att den inre loopen inte behöver utföras ofta. Dessutom kan ett index på kopplingsvillkoret för den inre tabellen avsevärt minska kostnaden för en kapslad loop-koppling och göra det till en attraktiv strategi.

I ditt fall beror det dåliga valet på en felaktig uppskattning:

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

Det gör att den inre slingan exekveras 7 gånger istället för en gång, så att exekveringstiden är 70 sekunder istället för 10.

Du bör samla in tabellstatistik om wind_forecast_recent :

ANALYZE wind_forecast_recent;

Kom ihåg att autoanalys inte gör det behandla utländska bord; det måste du sköta själv.

Om det inte hjälper kan du försöka ställa in use_remote_estimate alternativet på den främmande tabellen och se till att tabellstatistiken är korrekt på fjärrdatabasen.




  1. Odefinierat variabelfel i mitt PHP-skript

  2. Oracle Motsvarar MySQL INSERT IGNORE?

  3. hur man får array_agg() att fungera som group_concat() från mySQL

  4. JPA Criteria Builder ordning efter en summakolumn