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
Czy masz otwarte połączenia, które są w ' w stanie transakcji? (Możesz to sprawdzić za pomocą widoku 'pg_stat_activity') –
Tak. Czego konkretnie szukam w tym widoku? –
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. –