PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Langsamer sequenzieller Postgresql-Scan bei 500 Millionen Zeilen

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