Zajęty stół nie jest odkurzany

11

Używamy Postgres 9.2 w systemie Windows do przechowywania danych o niskiej częstotliwości szeregów czasowych: wstawiamy około 2000 wierszy na sekundę co sekundę 24 godziny, 7 dni w tygodniu bez przestojów. Jest taki, DELETEktóry działa na stole co około 10 minut, aby utrzymać długość stołu na określoną liczbę dni. W rezultacie jest to dość stabilna 900 milionów wierszy. (Dla zainteresowanych SELECT, INSERT, DELETEsą wydajnych).

Dlatego DELETEusuwanie wierszy nie zwalnia miejsca na dysku. W tym VACUUMcelu musimy biec.

Mam pytania pg_stat_user_tablesi VACUUMwydaje się, że nigdy nie działał.

Co rozumiem z różnych dokumentów ( http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html ):

  • wydaje się, że mamy włączone automatyczne odkurzanie i działa na innych stołach.
  • automatyczne odkurzanie nie działa FULLi nie powinno wymagać wyłącznego blokady na stole.

Czy ktoś ma jakieś przemyślenia, dlaczego nie działa automatyczne odkurzanie? Czy to tylko dlatego, że stół jest ciągle zajęty?

I czy warto w tym przypadku biegać VACUUMpo każdym DELETE(który działa co 10 minut)?

Edytować:

Zapytanie za pomocą SQL z linku SO poniżej:

-[ RECORD 2 ]---+---------------------------
schemaname      | stats
relname         | statistic_values_by_sec
last_vacuum     |
last_autovacuum |
n_tup           |    932,315,264
dead_tup        |    940,727,818
av_threshold    |    186,463,103
expect_av       | *

i surowa produkcja:

-[ RECORD 3 ]-----+---------------------------
relid             | 501908
schemaname        | stats
relname           | statistic_values_by_sec
seq_scan          | 12
seq_tup_read      | 4526762064
idx_scan          | 29643
idx_tup_fetch     | 2544206912
n_tup_ins         | 1573896877
n_tup_upd         | 0
n_tup_del         | 941176496
n_tup_hot_upd     | 0
n_live_tup        | 688858417
n_dead_tup        | 940727818
last_vacuum       |
last_autovacuum   |
last_analyze      |
last_autoanalyze  | 2014-08-09 01:36:21.703+01
vacuum_count      | 0
autovacuum_count  | 0
analyze_count     | 0
autoanalyze_count | 69
Barry
źródło
4
Zobacz Agresywne automatyczne odkurzanie na PostgreSQL . Byłoby również interesujące mieć select * from pg_stat_user_tablestę tabelę (użyj \xw psql do ładnie sformatowanego wyjścia)
Daniel Vérité
2
Ten link jest pomocny i być może odpowiada na pytanie - stół jest zbyt zajęty, aby działało automatyczne odkurzanie. @ DanielVérité Zaktualizowałem pytanie o wynik, o który prosiłeś.
Barry
3
To dużo martwych krotek! Jeśli to możliwe, rozważ podzielenie tabeli na partycje według datownika i upuszczenie starych partycji zamiast usuwania. Głównym zastrzeżeniem jest to, że unikalny indeks dla różnych partycji nie jest obsługiwany.
Daniel Vérité
1
Czy plik dziennika zawiera komunikaty o anulowaniu autovacuum w tej tabeli?
jjanes
@jjanes Nie - w logach nie było żadnych informacji o tym, że uruchomiono autovacuum.
Barry,

Odpowiedzi:

2

Zajrzałbym do partycjonowania . Jeśli podzielony na partycje w ciągu dnia, możesz po prostu upuścić całą partycję, gdy stanie się zbyt stara. Może nawet nie będziesz musiał odkurzać.

Ponadto ogólna wydajność może wzrosnąć, ponieważ nie wstawiasz miejsca, w którym usuwasz. Wystarczy napisać kod, aby utworzyć nowe partycje i usunąć stare.

Właśnie do tego służy partycjonowanie.

SQB
źródło