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

Postgresql sekventiel scanning langsom ydeevne på 500 millioner rækker

Der er kun få ting, der vil hjælpe med denne forespørgsel:

  • Selve scanningen ser ikke ud til at være problemet (det tog 42 sekunder), men hvis tabellen kunne opbevares i RAM, ville det måske være hurtigere.

  • Dit hovedproblem er den slags, som PostgreSQL allerede paralleliserer.

    Der er et par ting, du kan justere:

    • Forøg work_mem så meget som muligt, hvilket vil gøre sorteringen hurtigere.

    • Forøg max_worker_processes (dette kræver en genstart), max_parallel_workers og max_parallel_workers_per_gather så flere kerner kan bruges til forespørgslen.

      PostgreSQL har en intern logik til at beregne det maksimale antal parallelarbejdere, den er klar til at bruge til en tabel:den vil betragte lige så mange parallelarbejdere som

      log3 (tabelstørrelse / min_parallel_table_scan_size )

      Du kan tvinge den til at bruge flere processer end det med:

      ALTER TABLE ohlcv SET (parallel_workers = 20);
      

      Men max_parallel_workers stadig er den øvre grænse.

Hvis der ikke er nogen sletninger og opdateringer på tabellen, og dataene er indsat i sorteringsrækkefølge, kan du slippe afsted med bare at udelade ORDER BY klausul, forudsat at du indstiller synchronize_seqscans =off .




  1. Efter en enkelt transaktions dødvande på tværs af SQL Server-versioner

  2. Dynamisk transponering for ukendt rækkeværdi til kolonnenavn på postgres

  3. Python REST API'er med Flask, Connexion og SQLAlchemy - Del 3

  4. HQL-grænse i undervalgsforespørgsel