Używam PostgreSQL 9.1 na Ubuntu. Czy harmonogram jest VACUUM ANALYZE
nadal zalecany, czy też autovacuum wystarcza, aby zaspokoić wszystkie potrzeby?
Jeśli odpowiedź brzmi „to zależy”, to:
- Mam obszerną bazę danych (rozmiar zrzutu skompresowanego 30 GiB, katalog danych 200 GiB)
- Wykonuję ETL do bazy danych, importując prawie 3 miliony wierszy tygodniowo
- Wszystkie tabele z najczęstszymi zmianami są dziedziczone z tabeli głównej, bez danych w tabeli głównej (dane są dzielone według tygodni)
- Tworzę zestawienia godzinowe, a stamtąd raporty dzienne, tygodniowe i miesięczne
Pytam, ponieważ harmonogram VACUUM ANALYZE
ma wpływ na moje raportowanie. Działa przez ponad 5 godzin i musiałem go zabić dwa razy w tym tygodniu, ponieważ miało to wpływ na regularny import bazy danych. check_postgres
nie zgłasza żadnego znaczącego wzdęcia w bazie danych, więc to naprawdę nie jest problem.
Z dokumentów, auto-próżnia powinna również zadbać o zawijanie identyfikatorów transakcji. Pytanie brzmi: czy nadal potrzebuję VACUUM ANALYZE
?
postgresql
etl
vacuum
François Beausoleil
źródło
źródło
Odpowiedzi:
VACUUM jest potrzebne tylko w zaktualizowanych lub usuniętych wierszach w nietrwałych tabelach. Oczywiście robisz dużo WSTAWEK, ale z opisu nie wynika, że robisz również wiele AKTUALIZACJI lub USUŃ.
Te operacje można śledzić za pomocą
pg_stat_all_tables
widoku, w szczególności kolumnn_tup_upd
in_tup_del
. Ponadto, jeszcze bardziej do rzeczy, istniejen_dead_tup
kolumna, która mówi, dla każdej tabeli, ile rzędów należy odkurzyć. (patrz Monitorowanie statystyk w dokumencie dla funkcji i widoków związanych ze zbieraniem statystyk).Możliwą strategią w twoim przypadku byłoby stłumienie zaplanowanego VACUUM, pilnowanie tego widoku i sprawdzanie, przy których stołach
n_dead_tup
znacząco rośnie. Następnie zastosuj agresywne VACUUM tylko do tych tabel. To będzie zwycięstwo, jeśli istnieją duże stoły, których wiersze nigdy nie są usuwane ani aktualizowane, a agresywne VACUUM jest naprawdę konieczne tylko na mniejszych stołach.Ale uruchamiaj ANALIZĘ, aby optymalizator zawsze miał świeże statystyki.
źródło
W twoim pytaniu nie widzę nic, co
autovacuum
by się nie zajęło. W dużej mierze zależy to od wzoru twoich działań pisarskich . Wspominasz o 3 milionach nowych wierszy tygodniowo, aleINSERT
(lubCOPY
) zazwyczaj nie tworzysz rozlanych tabel i indeksów. (autovacuum
musi tylko dbać o statystyki kolumn , mapę widoczności i niektóre drobne prace).UPDATE
iDELETE
są dominującą przyczyną rozdęcia tabeli i indeksu, szczególnie przy celowaniu w losowe wiersze. Nic takiego nie widzę w twoim pytaniu.autovacuum
przeszedł długą drogę i robi świetną robotę w Postgres 9.1 lub nowszym. Chciałbym rzucić okiem naautovacuum
ustawienia . Jeśli odkurzanie może zakłócać obciążenie pracą, zapoznaj się z „Opóźnieniem próżniowym opartym na kosztach” . Odkurzanie ręczne powinno być rzadkim wyjątkiem.Jeśli masz wiele losowych
UPDATE
, możesz ustawić wartośćFILLFACTOR
niższą niż 100, aby od razu umożliwić GORĄCE aktualizacje i zmniejszyć potrzebęVACUUM
. Więcej informacji o aktualizacjach HOT:Zauważ też, że tabele tymczasowe wymagają ręcznego
VACUUM
&ANALYZE
. Cytuję instrukcję w sprawieCREATE TABLE
:źródło
Chociaż zgadzam się, że najlepsze jest używanie funkcji automatycznych zamiast uruchamiania całej bazy danych, ale w większości przypadków konieczne jest dostrajanie tabel.
Nie do końca zgadzam się z wyborem projektu postgresów do połączenia próżni i analizy, widziałem kilka przypadków, w których bazy danych, które wykonują wiele operacji wstawiania / aktualizacji, ale niewiele operacji usuwania, nigdy nie są analizowane i zaczynają źle działać.
Rozwiązaniem jest przejście do tabel, które są często przyzwyczajone i podlegają dużym zapytaniom oraz ustawienie ustawień automatycznej analizy dla tych tabel do poziomu, w którym analizowane są raz lub co drugi dzień.
Możesz przejść do ustawień poszczególnych tabel w gui na zakładce automatycznego odkurzania, a zobaczysz tam ustawienia analizy, które możesz ustawić niezależnie od próżni.
Ustawienia kończą się w tabeli relopcji i można je zobaczyć z zapytaniem
i może tam być przykładowa wartość analizy agresywnej
Aby zobaczyć, kiedy ostatnio tabele otrzymały automatycznie przeanalizowane zapytanie
źródło
ANALYZE
, to skąd PostgreSQL będzie wiedział, że statystyki się zmieniły? Jak ustalić, żeANALYZE
zajmuje to dużo czasu? Jednocześnie, chociaż nie jest całkiem jasne, o którym GUI wspomniałeś powyżej, masz rację, ponieważ określone ustawienia dla poszczególnych tabel mogą być przydatne.