Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W PostgreSQL istnieje mechanizm MVCC (więcej szczegółów poniżej) - wielowersyjność wierszy. Gdy aktualizujesz lub usuwasz dane, stare wersje wierszy nie znikają od razu. Pozostają w plikach tabel jako "martwy ładunek". Z czasem takich wierszy przybywa, tabele się rozrastają, indeksy tracą efektywność, a zapytania zaczynają działać wolniej.
Aby utrzymać bazę w zdrowym stanie, PostgreSQL wykorzystuje proces VACUUM. Usuwa on nieużywane wersje wierszy, zwalnia przestrzeń i pomaga aktualizować statystyki dla planera zapytań. To swoiste sprzątanie, które zazwyczaj nie wymaga ręcznego uruchamiania, ponieważ zazwyczaj działa automatyczny autovacuum.
Istnieje również VACUUM FULL - bardziej radykalna wersja. Nie tylko oczyszcza "śmieci", ale także fizycznie przebudowuje tabelę, zwracając miejsce systemowi plików. Cena - całkowite zablokowanie tabeli na czas operacji. Dlatego FULL używa się rzadko i głównie w nocnych oknach lub po masowych usunięciach.
Bez VACUUM PostgreSQL stopniowo degraduje: tabele rosną, indeksy tracą dokładność, zapytania stają się wolne, a autovacuum może zacząć działać zbyt agresywnie. Dlatego VACUUM - to nie tylko techniczne narzędzie, ale podstawowy mechanizm, który pozwala PostgreSQL utrzymywać wydajność przez długie lata.
MVCC (Multi-Version Concurrency Control)
MVCC (Multi-Version Concurrency Control) - to sposób, w jaki PostgreSQL i inne systemy baz danych pozwalają wielu klientom jednocześnie czytać i zmieniać dane bez blokad, które paraliżują pracę.
W zwykłych bazach danych bez MVCC jednoczesne zapisy i odczyty mogą powodować konflikty. MVCC rozwiązuje to w ten sposób: gdy aktualizujesz wiersz, baza nie nadpisuje go na starym, lecz tworzy nową wersję. Stara pozostaje dostępna dla tych transakcji, które ją jeszcze "widzą". Każda transakcja działa z własnym zrzutem danych, nie przeszkadzając innym.
Zaletą jest prosta - czytelnicy nie blokują zapisu, a zapis nie blokuje czytelników. Dlatego PostgreSQL może obsługiwać dużą liczbę równoległych operacji bez istotnych opóźnień.
Wada jest również oczywista - stare wersje się kumulują. I to właśnie VACUUM odpowiada za to, aby te "martwe" wiersze usuwać i utrzymywać bazę w czystym stanie.
Ten post nie ma jeszcze żadnych dodatków od autora.