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

PostgresSQL Nested Loops - Quando il pianificatore decide di utilizzare Nested Loop quando esegue un INNER JOIN?

Il pianificatore non decide di utilizzare una determinata strategia di unione sulla base di un ragionamento profondo, costruisce semplicemente tutte le possibili strategie di unione, stima il costo e sceglie quella più economica.

Detto questo, i join del ciclo nidificato sono generalmente la scelta migliore se la tabella esterna è piccola, in modo che il ciclo interno non debba essere eseguito spesso. Inoltre, un indice sulla condizione di join della tabella interna può ridurre notevolmente il costo di un join di ciclo nidificato e renderlo una strategia interessante.

Nel tuo caso, la scelta sbagliata è dovuta a una stima errata:

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

Ciò fa sì che il ciclo interno venga eseguito 7 volte anziché una, in modo che il tempo di esecuzione sia 70 secondi anziché 10.

Dovresti raccogliere le statistiche della tabella su wind_forecast_recent :

ANALYZE wind_forecast_recent;

Ricorda che l'analisi automatica non trattare tavole estere; devi occupartene tu stesso.

Se ciò non risolve il problema, puoi provare a impostare use_remote_estimate opzione sulla tabella esterna e assicurati che le statistiche della tabella siano accurate sul database remoto.