PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops - Quando o planejador decide usar Nested Loop ao fazer um INNER JOIN?


O planejador não decide usar uma determinada estratégia de junção com base em raciocínio profundo, ele simplesmente constrói todas as estratégias de junção possíveis, estima o custo e escolhe a mais barata.

Dito isso, as junções de loop aninhado geralmente são a melhor escolha se a tabela externa for pequena, para que o loop interno não precise ser executado com frequência. Além disso, um índice na condição de junção da tabela interna pode reduzir bastante o custo de uma junção de loop aninhado e torná-la uma estratégia atraente.

No seu caso, a má escolha se deve a uma estimativa incorreta:
Foreign Scan on wind_forecast_recent w  (cost=... rows=1 ...) (actual ... rows=7 ...)

Isso faz com que o loop interno seja executado 7 vezes em vez de uma vez, de modo que o tempo de execução seja de 70 segundos em vez de 10.

Você deve coletar estatísticas de tabela em wind_forecast_recent :
ANALYZE wind_forecast_recent;

Lembre-se de que a análise automática não tratar mesas estrangeiras; você tem que cuidar disso sozinho.

Se isso não funcionar, você pode tentar configurar o use_remote_estimate opção na tabela externa e certifique-se de que as estatísticas da tabela sejam precisas no banco de dados remoto.