VACUUM FREEZE vs. VACUUM FULL

18

Czy ktoś może wyjaśnić różnicę między tymi typami VACUUMw PostgreSQL?

Przeczytałem dokument, ale mówi tylko, że FULLblokuje tabele i FREEZE„zamraża” krotki. Myślę, że to tak samo. Czy się mylę?

Christian Maíz
źródło
Przeczytałeś dokument? Byłaby to idealna okazja, aby zamieścić link do tego, co przeczytałeś ...
Erwin Brandstetter

Odpowiedzi:

12

Oto krótka zwięzła odpowiedź.

Odkurzanie pełne usuwa wyłączną blokadę i odbudowuje stół, aby nie zawierał pustych bloków (na razie udajemy, że współczynnik wypełnienia wynosi 100%).

Zamrażanie próżniowe oznacza zawartość tabeli ze specjalnym znacznikiem czasu transakcji, który informuje postgres, że nie trzeba go odkurzać, nigdy. Następna aktualizacja tego zamrożonego identyfikatora zniknie.

Na przykład baza danych template0 jest zawieszana, ponieważ nigdy się nie zmienia (domyślnie nie można się z nią połączyć).

Co jakiś czas demon autovacuum sprawdza bazę danych i jej tabele, aby zobaczyć, co należy odkurzyć. Jeśli tabela jest zamrażana próżniowo, a następnie nigdy nie aktualizowana, demon autovacuum po prostu ją przejdzie. Również ochrona przed zawijaniem w postgresql nigdy nie uruchomi się na tym stole.

tl; dr zamrażanie oznacza, że ​​tabela nie wymaga żadnej konserwacji autovac. Następna aktualizacja go odblokuje.

Scott Marlowe
źródło
Czy więc VACUUM FREEZEwymaga wyłącznego zamka na stole? Wydaje się, że tak powinno być, w przeciwnym razie ryzykujesz nagle, że wiersze z aktywnych transakcji będą widoczne na całym świecie. Mogę to źle zrozumieć ...
Parthian Shot
Brak zamrażania próżniowego nie, próżnia pełna.
Scott Marlowe
6

Aby wyjaśnić, co napisał Jayadevan.

Sposób, w jaki Postgres działa z transakcjami i do śledzenia widocznych danych, polega na porównaniu wewnętrznych identyfikatorów transakcji. Ponieważ jednak te transakcje są 32-bitową liczbą całkowitą wcześniej czy później zawiną się, a zatem nowa transakcja będzie wyglądać, jakby była dokonana w przeszłości (a zatem będzie widoczna w bieżącej transakcji, a nie powinna), podczas gdy starsze transakcje będą wyglądały, jakby były dokonywane w przyszłości (a ponieważ przyszłość jeszcze nie istnieje, dane te nie będą już widoczne).

Aby postarać się rozwiązać ten problem, Postgres przypisuje do każdego wiersza, który jest wystarczająco stary, aby być narażonym na ryzyko zawinięcia, specjalny identyfikator transakcji, który zawsze jest starszy niż każda transakcja. Możesz zobaczyć, jak gdyby prawidłowe identyfikatory transakcji zawierały się w przedziale od 0 do 2147483647, ustawi identyfikator transakcji dla wszystkich bieżących wierszy na -1.

Ponieważ jednak próżnia ma zasadniczo oznaczać puste miejsce do ponownego użycia, działa tylko na stronach danych, które zostały zmienione.

W VACUUM FREEZEzasadzie zamrożenie identyfikatora transakcji dla wszystkich stron, bez względu na to, czy zostały zmodyfikowane, czy nie, aby wszystkie bieżące wiersze były traktowane jako stare dla wszystkich nowych transakcji.

Jednak od wersji 8.2 VACUUM FREEZEbyły przestarzałe i nie należy ich używać. Zamiast tego istnieje parametry vacuum_freeze_table_agei autovacuum_freeze_max_agektóra określa, jak wiele transakcji może nastąpić przed kompletnym skanowania jest wykonywana na stole (skutecznie zrobić wewnętrzny VACUUM FREEZEna stole).

Jimmy Stenke
źródło
3
Jak to możliwe, że dokumenty nie wspominają, VACUUM FREEZEże są przestarzałe / zniechęcone?
dezso
Ciekawy. Tak było w przypadku wersji między 8.2 a 9.0. Być może usunęli wycofanie, ponieważ może to być dobra cecha.
Jimmy Stenke
1

Skopiuj / wklej z odpowiedzi, kiedy zadałem to samo pytanie - „zwykła próżnia oznacza puste miejsce do ponownego użycia i odzyskuje puste miejsce na końcu relacji. Więc jeśli puste miejsce znajduje się na środku itp., Nie może być odzyskane, tylko ponownie wykorzystane.

próżnia pełna zagęszcza relację odzyskując całą pustą przestrzeń. Wymaga blokady wyłącznej i z tego powodu jest szkodliwa dla systemów produkcyjnych.

Tak więc celem REGULARNEJ próżni nie jest odzyskanie miejsca ze stolików, ale udostępnienie go do ponownego wykorzystania później. Celem próżni FULL jest odzyskanie całej zmarnowanej przestrzeni kosztem wyjątkowej wydajności blokady i dbania w trakcie jej działania.

Skoro więc zwykła próżnia nie ma na celu odzyskania wszystkiego, nie powinieneś być zaskoczony, że w rzeczywistości nie odzyskał wszystkiego. Wypróbuj eksperyment na większych zestawach danych z większą liczbą losowych usunięć itp., Aby zobaczyć różnicę między zwykłą a pełną próżnią ”.

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Aby dodać do tego, próżnia pełna faktycznie utworzy nowe pliki dla tabeli (istniejące pliki zmniejszyłyby się do rozmiaru 0). W ten sposób system operacyjny może odzyskać miejsce.

Jayadevan
źródło
2
Pytanie dotyczy VACUUM FREEZEw szczególności.
Erwin Brandstetter,
To prawda - „różnica między tego rodzaju próżniami w PostgreSQL” - myślałem, że pytanie dotyczy różnic między rodzajami próżni.
Jayadevan