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łącznejVACUUM FULL— przebudowuje tabelę; wymaga blokady wyłącznej; zwalnia miejsce na dysku do systemu operacyjnegoVACUUM 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
- MVCC i przyczyny bloatu
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE i pg_statistic
- Skanowanie wyłącznie indeksu i Visibility Map