sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops - Hvornår beslutter planlæggeren at bruge Nested Loop, når han laver en INNER JOIN?

Planlæggeren beslutter sig ikke for at bruge en bestemt joinstrategi baseret på dybt ræsonnement, den konstruerer blot alle mulige joinstrategier, anslår omkostningerne og vælger den billigste.

Når det er sagt, er indlejrede løkkesammenføjninger normalt det bedste valg, hvis den ydre tabel er lille, så den indre løkke ikke skal udføres ofte. Et indeks på den indre tabels sammenføjningstilstand kan også reducere omkostningerne ved en indlejret sløjfesammenføjning betydeligt og gøre det til en attraktiv strategi.

I dit tilfælde skyldes det dårlige valg en fejlvurdering:

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

Det får den indre sløjfe til at blive udført 7 gange i stedet for én gang, så udførelsestiden er 70 sekunder i stedet for 10.

Du bør indsamle tabelstatistik om wind_forecast_recent :

ANALYZE wind_forecast_recent;

Husk, at autoanalyse ikke gør behandle udenlandske borde; det skal du selv sørge for.

Hvis det ikke hjælper, kan du prøve at indstille use_remote_estimate mulighed på den udenlandske tabel og sørg for, at tabelstatistikken er nøjagtig på den eksterne database.




  1. Indlæser PictureBox-billede fra databasen

  2. Omstrukturering af en dårlig database med PHP-løkker eller MySQL

  3. ORA 00918- Kolonne tvetydigt defineret fejl

  4. Konvertering af valuta i MySQL ved hjælp af en join