PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Skanowanie sekwencyjne Postgresql ma niską wydajność na 500 milionach wierszy

Jest tylko kilka rzeczy, które pomogą w tym zapytaniu:

  • Samo skanowanie nie wydaje się być problemem (zajęło 42 sekundy), ale gdyby tabelę można było przechowywać w pamięci RAM, mogłoby to być szybsze.

  • Twoim głównym problemem jest rodzaj, który PostgreSQL już zrównoleglał.

    Jest kilka rzeczy, które możesz dostroić:

    • Zwiększ work_mem jak najwięcej, co przyspieszy sortowanie.

    • Zwiększ max_worker_processes (będzie to wymagało ponownego uruchomienia), max_parallel_workers i max_parallel_workers_per_gather aby więcej rdzeni mogło być użytych w zapytaniu.

      PostgreSQL ma wewnętrzną logikę obliczania maksymalnej liczby równoległych procesów roboczych, których jest gotowy do użycia dla tabeli:uwzględni tyle równoległych procesów roboczych, ile

      log3 (rozmiar tabeli / min_parallel_table_scan_size )

      Możesz zmusić go do użycia większej liczby procesów za pomocą:

      ALTER TABLE ohlcv SET (parallel_workers = 20);
      

      Ale max_parallel_workers nadal jest górną granicą.

Jeśli w tabeli nie ma żadnych usunięć ani aktualizacji, a dane są wstawiane w kolejności sortowania, możesz po prostu pominąć ORDER BY klauzula, pod warunkiem, że ustawisz synchronize_seqscans = off .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak osiągnąć wysoką dostępność PostgreSQL z pgBouncer?

  2. Plpgsql:Jak przypisać wartość do zmiennej w sekcji deklaracji?

  3. dostawca dla PostgreSQL w .net z obsługą TransactionScope

  4. Problem z accepts_nested_attributes_for w Railsach 5.0.0.beta3, opcja -api

  5. Jaki jest odpowiednik CHARINDEX (SQL SERVER) w POSTGRRESQL?