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_memper quanto possibile, il che renderà l'ordinamento più veloce. -
Aumenta
max_worker_processes(questo richiederà un riavvio),max_parallel_workersemax_parallel_workers_per_gatherin 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 .