Czy powinienem ręcznie VACUUM mojej bazy danych PostgreSQL, jeśli włączone jest automatyczne odkurzanie?

15

Używam oprogramowania, które tworzy dużą bazę danych PostgreSQL (jest tam tabela z milionem wierszy), a programiści mówią, że powinienem VACUUMi ANALYZEokresowo. Ale domyślna baza danych PostgreSQL jest autovacuumwłączona.

Czy powinienem w ogóle odkurzać / analizować? Jakie są korzyści? Jaka jest różnica między odkurzaniem automatycznym a ręcznym

Na przykład w Pgadmin3 mam to:
wprowadź opis zdjęcia tutaj

kissgyorgy
źródło

Odpowiedzi:

12

Zgadzam się z ETL, że nie ma krótkiej odpowiedzi. Rozmiar nie jest jedyną rzeczą, która ma znaczenie - prowadzimy dość duże bazy danych PostgreSQL OLTP (z niektórymi tabelami> 100 000 000 wierszy) pod dużym obciążeniem i obecnie polegamy wyłącznie na autovacuum.

Jednak dwie rzeczy wydają mi się ważne:

  • Wydaje się, że istnieje konsensus, że auto-próżni nigdy nie należy wyłączać, chyba że masz bardzo dobrze zdefiniowane obciążenie bazy danych i dokładnie wiesz, co robisz. Ale oczywiście możesz wykonywać dodatkowe VACUUMi / lub ANALYZEbiegi.

  • Przed rozważeniem dodatkowych VACUUMuruchomień sprawdziłbym, jak utrzymuje się autovacuum. Możesz sprawdzić, czy dowolne tabele są powyżej progu automatycznego próżni, sprawdzając pg_stat_user_tablesi pg_class. Wysłałem takie zapytanie do innego wątku, który może być interesujący: Agresywne autowciśnienie na PostgreSQL .

    Niestety wykonanie podobnej kontroli progów autoanalizy nie jest tak łatwe (tj. Obecnie niemożliwe). Jednak autoanaliza kopnięć rozpoczyna się na długo przed automatyczną próżnią i jest znacznie tańsza. Zasadniczo, jeśli baza danych jest w stanie nadążyć za automatycznym odkurzaniem, prawdopodobnie będzie to również w przypadku autoanalizy. Można również uzyskać informacje na temat ostatnich dat automatycznej analizy pg_stat_user_tables.

Niektóre części (najdoskonalszej) dokumentacji PostgreSQL, które uznałem za pomocne:

pygrac
źródło
7

Autovacuum powinno całkiem dobrze to zakryć, chyba że coś źle skonfigurowałeś. Inne odpowiedzi już to obejmują.

Jest jednak jeden jasno określony przypadek manualny VACUUM (a co ważniejsze: ręczny ANALYZE): tabele tymczasowe , nie są one uwzględniane przez demona autovacuum. Cytuję instrukcję CREATE TABLEtutaj :

Demon autovacuum nie mają dostępu, a zatem nie może odkurzać lub analizować tabele tymczasowe. Z tego powodu należy wykonywać odpowiednie operacje próżniowe i analizować za pomocą komend SQL sesji. Na przykład, jeśli tymczasowa tabela będzie używana w złożonych zapytaniach, mądrze jest uruchomić ANALYZEtabelę tymczasową po jej zapełnieniu.

Erwin Brandstetter
źródło
4

Nie ma na to krótkiej odpowiedzi, ponieważ zależy to od wielu czynników. Czy system działa powoli? Czy auto-próżnia faktycznie dotyka tego stołu? itp.

Oto kilka dobrych linków na ten temat:

Aby podjąć jasną decyzję, konieczne jest zrozumienie samej bazy danych i więcej szczegółów na temat tego, co się dzieje.

ETL
źródło
1

Nie sądzę, że musisz ręcznie odkurzać, chyba że zaczniesz zauważać spadek wydajności. Jednak zdecydowanie zalecam sprawdzenie ustawień próżni i automatycznego odkurzania i dostosowanie go do swoich potrzeb

Aby zobaczyć bieżące ustawienia, uruchom następujące zapytanie:

SELECT *
FROM pg_settings 
WHERE name LIKE '%vacuum%'

Większość pól nie wymaga wyjaśnień, ale znajduje się na nich dokumentacja: https://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html

Powiedziałbym, że Twoim celem powinno być skonfigurowanie automatycznego odkurzania w celu konsekwentnego czyszczenia śmieci, ale nie uruchamiaj automatycznego odkurzania w sposób ciągły

Najważniejsze ustawienia to:

  • autovacuum_vacuum_scale_factor - określa procent krotek, które mogą być martwe przed uruchomieniem czyszczenia. Wartość domyślna = 0,2
  • autovacuum_vacuum_threshold - minimalna liczba martwych krotek przed uruchomieniem czyszczenia. Wartość domyślna = 50

Próg pomaga zapobiegać zbyt częstemu uruchamianiu procesu czyszczenia w przypadku małych tabel.

Ustawienia domyślne działają dobrze, chyba że masz bardzo duże tabele. Mówiąc najprościej, jeśli zdarzy się, że masz stolik, który zabiera 100 GB, zgromadzisz 20 GB śmieci, zanim uruchomi się automatyczne odkurzanie. Dlatego zwykle zalecam ustawienie niskiego współczynnika skali. Jak nisko powinieneś sam określić. Używam 0,05 w moim bieżącym projekcie

Progi można również zwiększyć. Wiele aplikacji ma kilka tabel, które są często aktualizowane, a 50 krotek to niewiele. Zwiększenie tego do 1000 nie powinno prowadzić do żadnych problemów, ale oczywiście powinieneś rozważyć swój własny przypadek

Możesz również dostroić autovacuum i mieć różne ustawienia dla niektórych swoich tabel

ALTER TABLE your_table SET (autovacuum_vacuum_scale_factor = 0.05);

Jeśli skonfigurujesz współczynnik skali i progi, wszystko powinno być w porządku. Możesz także zwiększyć wartość autovacuum_vacuum_cost_limit, która domyślnie jest równa vacuum_cost_limit, która jest ustawiona na 200. Jest to bardzo ważna cecha próżni, która nie pozwala jej zużyć wszystkich zasobów i pozwala twojej aplikacji działać z danymi nawet podczas procesu odkurzania , ale wartość domyślna jest zbyt niska. Zwiększenie go do 1000 nie powinno prowadzić do znaczących opóźnień, ale pozwoli znacznie szybciej zakończyć proces próżniowy

Oczywiście można również uruchomić próżnię ręcznie. W najprostszym przypadku możesz mieć prostą pracę crona, która dokona pełnego czyszczenia każdej nocy, gdy twoja baza danych nie jest często używana

Mam nadzieję, że to pomaga!

Hasan Ammori
źródło