PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La scansione sequenziale Postgresql rallenta le prestazioni su 500 milioni di righe

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 e max_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 .