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_memco nejvíce, což urychlí řazení. -
Zvyšte
max_worker_processes(to bude vyžadovat restart),max_parallel_workersamax_parallel_workers_per_gatheraby 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_workersstá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 .