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

Sekvenční skenování Postgresql zpomaluje výkon na 500 milionech řádků

S tímto dotazem pomůže jen pár věcí:

  • Skutečné skenování se nezdá být problémem (trvalo to 42 sekund), ale pokud by bylo možné tabulku ponechat v paměti RAM, mohlo by to být rychlejší.

  • Vaším hlavním problémem je řazení, které PostgreSQL již paralelizuje.

    Existuje několik věcí, které můžete vyladit:

    • Zvyšte work_mem co nejvíce, což urychlí řazení.

    • Zvyšte max_worker_processes (to bude vyžadovat restart), max_parallel_workers a max_parallel_workers_per_gather aby bylo možné pro dotaz použít více jader.

      PostgreSQL má interní logiku pro výpočet maximálního počtu paralelních pracovníků, které je připraven použít pro tabulku:bude uvažovat tolik paralelních pracovníků, kolik je

      log3 (velikost tabulky / min_parallel_table_scan_size )

      Pomocí:

      jej můžete vynutit, aby používal více procesů
      ALTER TABLE ohlcv SET (parallel_workers = 20);
      

      Ale max_parallel_workers stále je horní hranice.

Pokud v tabulce nejsou žádná smazání a aktualizace a data jsou vložena v pořadí řazení, můžete jednoduše vynechat ORDER BY klauzule za předpokladu, že nastavíte synchronize_seqscans = off .




  1. Co je špatného na této uložené proceduře?

  2. Vložte dávku do Laravel 5

  3. SQL JOIN v PostgreSQL - Jiný plán provádění v klauzuli WHERE než v klauzuli ON

  4. T-SQL datetime zaokrouhlené na nejbližší minutu a nejbližší hodiny pomocí funkcí