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
amax_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
.