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

Postgresql - Jak przyspieszyć aktualizację ogromnej tabeli (100 milionów wierszy)?

Ponieważ łączysz się z dwoma dużymi tabelami i nie ma warunków, które mogłyby odfiltrować wiersze, jedyną skuteczną strategią łączenia będzie łączenie haszujące, a żaden indeks nie może w tym pomóc.

Najpierw nastąpi sekwencyjne skanowanie jednej z tabel, na podstawie której zbudowana jest struktura haszowania, następnie będzie sekwencyjne skanowanie drugiej tabeli, a hash zostanie zbadany dla każdego znalezionego wiersza. Jak jakikolwiek indeks mógłby w tym pomóc?

Możesz spodziewać się, że taka operacja zajmie dużo czasu, ale istnieje kilka sposobów na przyspieszenie operacji:

  • Usuń wszystkie indeksy i ograniczenia na tx_input1 zanim zaczniesz. Twoje zapytanie jest jednym z przykładów, w których indeks wcale nie pomaga, ale w rzeczywistości boli wydajność, ponieważ indeksy muszą być aktualizowane wraz z tabelą. Odtwórz indeksy i ograniczenia po zakończeniu UPDATE . W zależności od liczby indeksów na stole, możesz spodziewać się przyzwoitego lub ogromnego przyrostu wydajności.

  • Zwiększ work_mem parametr dla tej jednej operacji z SET dowodzić tak wysoko, jak tylko możesz. Im więcej pamięci może wykorzystać operacja skrótu, tym szybciej będzie. Przy tak dużym stole prawdopodobnie nadal będziesz mieć pliki tymczasowe, ale nadal możesz oczekiwać przyzwoitego wzrostu wydajności.

  • Zwiększ checkpoint_segments (lub max_wal_size od wersji 9.6) do wysokiej wartości, aby podczas UPDATE było mniej punktów kontrolnych operacja.

  • Upewnij się, że statystyki obu tabel są dokładne, aby PostgreSQL mógł dobrze oszacować liczbę wiader mieszających do utworzenia.

Po UPDATE , jeśli ma wpływ na dużą liczbę wierszy, możesz rozważyć uruchomienie VACUUM (FULL) na tx_input1 pozbyć się powstałego wzdęcia stołu. Spowoduje to zablokowanie tabeli na dłuższy czas, więc zrób to podczas okna konserwacji. Zmniejszy to rozmiar tabeli i w konsekwencji przyspieszy sekwencyjne skanowanie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przewodnik po PGpool — wskazówki i obserwacje:część trzecia

  2. PostgreSQL - składnia DISTINCT ON i GROUP BY

  3. Pisanie pliku przy użyciu wielu wątków

  4. Postgres CASE w kolejności BY przy użyciu aliasu

  5. Postgres COUNT liczba wartości kolumn z INNER JOIN