2014-04-01 11 views
5

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 
+0

Avete connessioni aperte che si trovano nella ' in stato della transazione? (Puoi verificarlo tramite la vista 'pg_stat_activity') –

+0

Sì. Cosa sto specificatamente cercando su quella vista? –

+0

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 –

risposta

0

Sembra proprio le tabelle devono essere vuoto analizzata in cui il 10% dei dei tuple sono cambiate. In base all'impostazione postgresql.conf posato,

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

Altre cose da controllare:

esecuzione
  • Is autovacuum? ps -ef | grep vacuum
  • Assicurarsi che non sta controllando su un server in standby o slave

Vedi diapositive dal discorso autovacuum di Gabrielle Roth alla Scala: https://wiki.postgresql.org/images/b/b5/Groth_scale12x_autovacuum.pdf

Problemi correlati