Ci sono solo poche cose che aiuteranno con questa query:
-
La scansione effettiva non sembra essere il problema (ci sono voluti 42 secondi), ma se la tabella potesse essere mantenuta nella RAM, potrebbe essere più veloce.
-
Il tuo problema principale è l'ordinamento, che PostgreSQL già parallelizza.
Ci sono alcune cose che potresti mettere a punto:
-
Aumenta
work_mem
per quanto possibile, il che renderà l'ordinamento più veloce. -
Aumenta
max_worker_processes
(questo richiederà un riavvio),max_parallel_workers
emax_parallel_workers_per_gather
in modo che più core possano essere utilizzati per la query.PostgreSQL ha una logica interna per calcolare il numero massimo di lavoratori paralleli che è pronto per utilizzare per una tabella:considererà tanti lavoratori paralleli quanti
log3 (dimensione tabella /
min_parallel_table_scan_size
)Puoi forzarlo a utilizzare più processi di quello con:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Ma
max_parallel_workers
è ancora il limite superiore.
-
Se non ci sono eliminazioni e aggiornamenti sulla tabella e i dati sono inseriti in ordine di ordinamento, potresti semplicemente omettere il ORDER BY
clausola, a condizione che tu abbia impostato synchronize_seqscans = off
.