sql >> Database >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops - Wanneer besluit de planner om Nested Loop te gebruiken bij het doen van een INNER JOIN?

De planner besluit niet om een ​​bepaalde join-strategie te gebruiken op basis van diepzinnig redeneren, maar construeert eenvoudig alle mogelijke join-strategieën, schat de kosten in en kiest de goedkoopste.

Dat gezegd hebbende, zijn geneste lus-joins meestal de beste keuze als de buitenste tabel klein is, zodat de binnenste lus niet vaak hoeft te worden uitgevoerd. Ook kan een index op de join-voorwaarde van de binnenste tabel de kosten van een geneste lus-join aanzienlijk verlagen en er een aantrekkelijke strategie van maken.

In jouw geval is de slechte keuze te wijten aan een verkeerde inschatting:

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

Dat zorgt ervoor dat de binnenste lus 7 keer wordt uitgevoerd in plaats van één keer, zodat de uitvoeringstijd 70 seconden is in plaats van 10.

U moet tabelstatistieken verzamelen op wind_forecast_recent :

ANALYZE wind_forecast_recent;

Onthoud dat automatische analyse niet . doet buitenlandse tafels behandelen; daar moet je zelf voor zorgen.

Als dat niet werkt, kunt u proberen de use_remote_estimate in te stellen optie op de vreemde tafel en zorg ervoor dat de tabelstatistieken correct zijn in de externe database.




  1. Oracle to Derby - ConnectBy en start met equivalent in Derby

  2. Hoe om te gaan met to_date-uitzonderingen in een SELECT-instructie om die rijen te negeren?

  3. MySQL select for update retourneert een lege set, ook al bestaat er een rij

  4. SQL-limiet SELECT maar niet JOIN