2014-04-01 10 views
5

Zauważyłem, że baza danych, którą dostrajam (postgres 9.2), nie jest uruchamiana automatycznie dla wielu tabel, które mnie interesują, i nie do końca rozumiem, dlaczego . Moje zrozumienie/oczekiwania są takie, że w oparciu o bieżącą konfigurację autoanaliza zostanie uruchomiona przy założeniu, że tabela rośnie lub jest modyfikowana przez> = 10% wierszy. Jednak nie dzieje się tak w oparciu o informacje, które widzę podczas wysyłania zapytań do bazy danych.Analiza automatyczna nie działa dla wszystkich tabel w bazie danych Postgres 9.2

Oto komplet wyników z uruchomieniem kwerendy na pg_stat_all_tables w bazie danych, który został uruchomiony w prod ponad roku (wyniki obcięty i nazwy prawdziwy stół redacted)

┌────────────────────┬────────────────────────────────────┬──────────────────┬───────────────────┐ 
│  relname  │ last_autovacuum │ autovacuum_count │ last_autoanalyze │ autoanalyze_count │ 
├────────────────────┼─────────────────┼──────────────────┼──────────────────┼───────────────────┤ 
│ a_large_table  │ ¤    │    0 │ ¤    │     0 │ 
│ table_a   │ 2014-04-01  │    1 │ 2014-04-01  │     1 │ 
│ table_b   │ 2014-04-01  │    1 │ 2014-04-01  │     1 │ 
│ a_very_large_table │ ¤    │    0 │ ¤    │     0 │ 
└────────────────────┴─────────────────┴──────────────────┴──────────────────┴───────────────────┘ 

Uwaga, table_a i table_b są często oczyszczone ze starych danych, więc ma sens, że miałyby one ostatnio automatyczną autowulkanizację/autoanalizę. Jednak spodziewam się również, że inne duże stoły zostały przynajmniej przeanalizowane w ostatnim czasie.

Na wszelki wypadek, oto postgresql.conf ...

#------------------------------------------------------------------------------ 
# AUTOVACUUM PARAMETERS 
#------------------------------------------------------------------------------ 

autovacuum = on 

log_autovacuum_min_duration = 1000 

autovacuum_max_workers = 3 

autovacuum_naptime = 1min 

autovacuum_vacuum_threshold = 100 

autovacuum_analyze_threshold = 100 

autovacuum_vacuum_scale_factor = 0.2 

autovacuum_analyze_scale_factor = 0.1 

autovacuum_freeze_max_age = 200000000 

autovacuum_vacuum_cost_delay = 20ms 

autovacuum_vacuum_cost_limit = -1 
+0

Czy masz otwarte połączenia, które są w ' w stanie transakcji? (Możesz to sprawdzić za pomocą widoku 'pg_stat_activity') –

+0

Tak. Czego konkretnie szukam w tym widoku? –

+0

Połączenia w stanie ' w transakcji' utrzymują blokady, które uniemożliwiają automatyczne pobieranie z martwych wierszy (ponieważ nie są one martwe, transakcje te nadal je widzą). Musisz upewnić się, że wszystkie transakcje kończą się 'commit'. Powinieneś mieć tylko połączenia w stanie ''. Nie zapobiegnie to wykonywaniu zadania przez automatyczne uruchamianie. –

Odpowiedz

0

To wygląda jak stoły powinny być analizowane przy próżni 10% z krotek są zmieniane. W oparciu o stwarzane ustawienia postgresql.conf,

autovacuum analyze threshold = 100 + 0.1 * table size before vacuum 

innych rzeczy do sprawdzenia:

  • Czy autovacuum uruchomiony? ps -ef | grep vacuum
  • Upewnij się, że nie jesteś sprawdzanie na gotowości lub podrzędnego serwera

Zobacz slajdy z talk autovacuum Gabrielle Roth w Skali: https://wiki.postgresql.org/images/b/b5/Groth_scale12x_autovacuum.pdf

Powiązane problemy