Es gibt nur wenige Dinge, die bei dieser Abfrage helfen:
-
Das eigentliche Scannen scheint nicht das Problem zu sein (es dauerte 42 Sekunden), aber wenn die Tabelle im RAM gehalten werden könnte, wäre es vielleicht schneller.
-
Ihr Hauptproblem ist die Sortierung, die PostgreSQL bereits parallelisiert.
Es gibt ein paar Dinge, die Sie optimieren könnten:
-
Erhöhen Sie
work_mem
so viel wie möglich, was die Sortierung beschleunigt. -
Erhöhen Sie
max_worker_processes
(Dies erfordert einen Neustart),max_parallel_workers
undmax_parallel_workers_per_gather
damit mehr Kerne für die Abfrage verwendet werden können.PostgreSQL verfügt über eine interne Logik zur Berechnung der maximalen Anzahl paralleler Worker, die es für eine Tabelle verwenden kann:Es berücksichtigt so viele parallele Worker wie
log3 (Tabellengröße /
min_parallel_table_scan_size
)Sie können es zwingen, mehr Prozesse zu verwenden mit:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Aber
max_parallel_workers
ist immer noch die Obergrenze.
-
Wenn es keine Löschungen und Aktualisierungen in der Tabelle gibt und die Daten in sortierter Reihenfolge eingefügt werden, könnten Sie einfach den ORDER BY
weglassen -Klausel, vorausgesetzt, Sie setzen synchronize_seqscans = off
.