Ho notato che un database I am tuning (postgres 9.2) non esegue autoanalyze per molte delle tabelle a cui sono interessato, e non capisco perché . La mia comprensione/aspettative è quella basata sulla configurazione corrente, autoanalyze verrà eseguito supponendo che la tabella cresca o sia modificata di> = 10% delle righe. Tuttavia, questo non è il caso sulla base delle informazioni che sto vedendo durante l'interrogazione del database.Analisi automatica non in esecuzione per tutte le tabelle nel database Postgres 9.2
Ecco una serie di risultati di esecuzione di una query su pg_stat_all_tables su un database che è stato in esecuzione in prod per oltre un anno (risultati troncati e nomi reali di tabella redatte)
┌────────────────────┬────────────────────────────────────┬──────────────────┬───────────────────┐
│ 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 │
└────────────────────┴─────────────────┴──────────────────┴──────────────────┴───────────────────┘
nota, table_a e table_b sono spesso pulito di vecchi dati, quindi ha senso che questi avrebbero avuto un autovacuum/autoanalyze di recente. Tuttavia, mi aspetto che anche le altre tabelle di grandi dimensioni siano state analizzate almeno di recente.
Per buona misura, ecco la 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
Avete connessioni aperte che si trovano nella ' in stato della transazione? (Puoi verificarlo tramite la vista 'pg_stat_activity') –
Sì. Cosa sto specificatamente cercando su quella vista? –
Le connessioni nello stato ' nella transazione' mantengono i blocchi che impediscono a autovacuum di rimuovere le righe morte (perché non sono morte, quelle transazioni le vedono ancora). Devi assicurarti di terminare tutte le transazioni con un 'commit'. Dovresti avere solo connessioni nello stato ''. Quelli non impediranno a autovacuum di eseguire il proprio lavoro –