Czy muszę usunąć REINDEX i VACUUM tabelę po usunięciu wielu wierszy?

10

Korzystam z bazy danych PostgreSQL, która zawiera kilka tabel, w których przechowywane są informacje o logowaniu. Informacje te służą wyłącznie do celów sprawozdawczych i są zrzucane do pliku i usuwane z bazy danych, jeśli są starsze niż 30 dni.

Mogą zostać usunięte miliony wierszy, a za każdym razem po usunięciu uruchomiliśmy REINDEX.

Czy to wystarcza, czy też powinniśmy również uruchomić VACUUM lub VACUUM ANALYZE? A może REINDEX nie jest konieczny i zamiast tego powinniśmy po prostu uruchomić VACUUM lub VACUUM ANALYZE?

Używamy PostgreSQL 8.2.3, który moim zdaniem nie pozwala na automatyczne odkurzanie.

cowgod
źródło
2
Możesz rozważyć partycjonowanie, patrz postgresql.org/docs/9.0/static/ddl-partitioning.html ; możesz po prostu usunąć partycje i uniknąć odkurzania.
alex
3
Wersja 8.2.3 ma auto_vacuum, zobacz instrukcję, ale powinieneś zaktualizować jak najszybciej. Obecna wersja 8.2 to 8.2.17. Masz za sobą 14 łatek, w tym kilka poprawek bezpieczeństwa. Ulepszenie do wersji 8.4 lub nawet 9.0 jest lepszym pomysłem, poprawiono auto_vacuum.
Frank Heikens

Odpowiedzi:

13

Powinieneś wykonać VACUUM ANALYZE, ponieważ VACUUM pozwoli na ponowne wykorzystanie miejsca wykorzystanego przez usunięte dane i zapobiegnie zawijaniu transakcji, a ANALYZE zaktualizuje statystyki planisty, co powinno doprowadzić do lepszych planów zapytań dla twoich zapytań sprawozdawczych.

REINDEX nie jest teoretycznie wymagany, ale może się okazać, że daje lepszą wydajność, ponieważ indeks jest ciągły.

Odpowiednie strony dokumentacji dla 8.2 znajdują się tutaj (rutynowe ponowne indeksowanie) i tutaj (rutynowe odkurzanie) .

Hmallett
źródło