sql >> Databáze >  >> RDS >> PostgreSQL

PostgresSQL Nested Loops – Kdy se plánovač rozhodne použít Nested Loop při provádění INNER JOIN?

Plánovač se nerozhodne použít určitou strategii spojení na základě hluboké úvahy, jednoduše zkonstruuje všechny možné strategie spojení, odhadne náklady a vybere tu nejlevnější.

To znamená, že spojení vnořených smyček jsou obvykle nejlepší volbou, pokud je vnější tabulka malá, takže vnitřní smyčka se nemusí spouštět často. Index ve stavu spojení vnitřní tabulky také může výrazně snížit náklady na spojení vnořené smyčky a učinit z něj atraktivní strategii.

Ve vašem případě je špatná volba způsobena špatným odhadem:

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

To způsobí, že vnitřní smyčka bude provedena 7krát místo jednou, takže doba provedení je 70 sekund namísto 10.

Měli byste shromažďovat statistiky tabulky wind_forecast_recent :

ANALYZE wind_forecast_recent;

Pamatujte, že automatická analýza nedělá ošetřit cizí stoly; musíte se o to postarat sami.

Pokud to nepomůže, můžete zkusit nastavit use_remote_estimate možnost na cizí tabulce a ujistěte se, že statistiky tabulky jsou ve vzdálené databázi přesné.




  1. TXT soubor nebo databáze?

  2. PHP Mysql PDO počet vázaných proměnných neodpovídá počtu tokenů

  3. metoda table_exists() možná nefunguje správně

  4. Připravený příkaz nelze provést vícekrát s celočíselnými hodnotami