Czy ktoś może wyjaśnić różnicę między tymi typami VACUUM
w PostgreSQL?
Przeczytałem dokument, ale mówi tylko, że FULL
blokuje tabele i FREEZE
„zamraża” krotki. Myślę, że to tak samo. Czy się mylę?
Czy ktoś może wyjaśnić różnicę między tymi typami VACUUM
w PostgreSQL?
Przeczytałem dokument, ale mówi tylko, że FULL
blokuje tabele i FREEZE
„zamraża” krotki. Myślę, że to tak samo. Czy się mylę?
Odpowiedzi:
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.
VACUUM FREEZE
wymaga 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ć ...
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 FREEZE
zasadzie 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 FREEZE
były przestarzałe i nie należy ich używać. Zamiast tego istnieje parametry vacuum_freeze_table_age
i autovacuum_freeze_max_age
która określa, jak wiele transakcji może nastąpić przed kompletnym skanowania jest wykonywana na stole (skutecznie zrobić wewnętrzny VACUUM FREEZE
na stole).
VACUUM FREEZE
że są przestarzałe / zniechęcone?
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.
VACUUM FREEZE
w szczególności.