0Pricing
SQL Academy · Lekcja

VACUUM, autovacuum, vacuum_cost_delay

Dostrajać progi autovacuum, vacuum_cost_delay i równoległy VACUUM dla dużych tabel

VACUUM, autovacuum, vacuum_cost_delay to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Trzy tryby VACUUM

  • VACUUM (leniwy) — odzyskuje martwe wiersze, aktualizuje mapę wolnego miejsca, nie wymaga blokady wyłącznej
  • VACUUM FULL — przebudowuje tabelę; wymaga blokady wyłącznej; zwalnia miejsce na dysku do systemu operacyjnego
  • VACUUM ANALYZE — wykonuje VACUUM i odświeża statystyki planisty w jednym kroku

Ręczne uruchamianie VACUUM

Czasami jest przydatne nawet przy włączonym autovacuum:

VACUUM (VERBOSE) orders;
VACUUM (VERBOSE, ANALYZE) orders;
VACUUM (PARALLEL 4) orders;       -- parallel index cleanup (PG 13+)

Proces autovacuum

Proces uruchamiany w tle tworzy procesy robocze, które wykonują VACUUM na tabelach przekraczających ustalone progi. Domyślnie kilka procesów roboczych obsługuje cały klaster.

Dostrajanie dla poszczególnych tabel

Intensywnie używane tabele korzystają z agresywnego autovacuum:

ALTER TABLE busy_table SET (
  autovacuum_vacuum_scale_factor = 0.05,    -- 5% dead vs default 20%
  autovacuum_vacuum_threshold    = 1000,
  autovacuum_analyze_scale_factor = 0.05
);

vacuum_cost_delay

Ogranicza operacje wejścia-wyjścia wykonywane przez VACUUM, aby nie obciążać zapytań pierwszoplanowych. Wartość domyślna w PG 12+ to 2 ms — zwykle jest odpowiednia. W przypadku dysków SSD można ją zmniejszyć:

autovacuum_vacuum_cost_delay = 2ms
-- Lower delay = faster vacuum, more I/O usage.
-- Set per-table for hot tables that need faster cleanup.

Równoległy VACUUM

Od wersji PG 13 VACUUM wykonuje czyszczenie indeksów równolegle:

VACUUM (PARALLEL 4) big_table;
-- Each index cleaned by a parallel worker (up to max_parallel_maintenance_workers).

VACUUM FULL: kiedy i dlaczego

Przebudowuje tabelę od podstaw — zwalnia miejsce do systemu operacyjnego. Uzyskuje blokadę ACCESS EXCLUSIVE. Należy używać go tylko w ostateczności lub zamiast niego użyć pg_repack.

VACUUM FULL orders;
-- Locks orders; rewrites; on huge tables this is hours of downtime.

pg_repack: alternatywa online

Przebudowuje tabelę online — bez pełnej blokady. Daje taki sam efekt jak VACUUM FULL, ale nadaje się do użycia w środowisku produkcyjnym:

pg_repack -d mydb -t orders
-- Builds a shadow table, sync, swaps in.

Monitorowanie autovacuum

Wyświetlanie czasów ostatnich operacji vacuum/analyze oraz liczby martwych krotek:

SELECT relname,
       n_live_tup, n_dead_tup,
       last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

Gdy autovacuum nie nadąża

Objawy:

  • Narasta bloat
  • Wartość n_dead_tup w pg_stat_user_tables jest wysoka
  • Plany zapytań ulegają pogorszeniu

Rozwiązania: zwiększyć autovacuum_max_workers, zmniejszyć współczynnik skalowania dla poszczególnych tabel, usunąć długotrwałe transakcje blokujące VACUUM.

Rejestrowanie VACUUM

W celu dostrajania należy rejestrować informacje o powolnych operacjach VACUUM:

log_autovacuum_min_duration = '500ms'
-- Logs every autovacuum action that took longer than 500ms.

FREEZE

VACUUM co pewien czas „zamraża” stare krotki, aby zapobiec przepełnieniu identyfikatora transakcji (xid wraparound). Agresywny autovacuum utrzymuje niski wiek zamrożenia i zapobiega awaryjnym zdarzeniom związanym z przepełnieniem.

Podsumowanie

Autovacuum jest niezbędny; należy go dostrajać do charakterystyki obciążenia.

  • Ustawienia autovacuum dla poszczególnych tabel intensywnie używanych
  • VACUUM FULL to ostateczność — należy preferować pg_repack
  • Monitorowanie n_dead_tup i last_autovacuum
  • Usuwanie długotrwałych transakcji blokujących czyszczenie

Szybkie sprawdzenie

Jaki jest najbezpieczniejszy sposób odzyskania miejsca na dysku w intensywnie używanej tabeli produkcyjnej bez długotrwałego blokowania?

Często zadawane pytania

Czy lekcja „VACUUM, autovacuum, vacuum_cost_delay” jest bezpłatna?

Tak — pełny tekst „VACUUM, autovacuum, vacuum_cost_delay” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „VACUUM, autovacuum, vacuum_cost_delay”?

Dostrajać progi autovacuum, vacuum_cost_delay i równoległy VACUUM dla dużych tabel Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „VACUUM, autovacuum, vacuum_cost_delay”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. MVCC i przyczyny bloatu
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE i pg_statistic
  4. Skanowanie wyłącznie indeksu i Visibility Map
← Powrót do SQL Academy