Ogni giorno al mattino presto un lavoro pgAgent aggiorna il contenuto della tabella A dalla tabella B sul mio database PostgreSQL 8.4. La tabella A contiene circa 140k record su 91 colonne e ha due indici: uno come parte del PRIMARY KEY e l'altro un indice GIST su una colonna geometrica POINT PostGIS.
Per rendere il processo un po 'più veloce, il lavoro rilascia l'indice sulla colonna della geometria, prima di eliminare i record nella tabella A e inserire i record dalla tabella B, quindi l'indice viene ricreato. Tutto ciò fatto, il demone autovacuum si mette in funzione quando ne ha voglia (dopo circa dieci minuti dal confronto tra le statistiche del lavoro e le statistiche della tabella per il tempo di completamento del lavoro e il tempo di esecuzione di autovacuum).
Dopo aver verificato il tavolo questa mattina dopo che tutto ciò è accaduto, le statistiche del tavolo mi hanno detto che la dimensione del tavolo era 272 MB, la dimensione del tavolo TOAST era 8192 byte e la dimensione dell'indice era 23 MB. Sembrava abbastanza grande, quindi ho emesso un comando REINDEX sul tavolo e la dimensione dell'indice è scesa a 9832 KB.
Le mie domande sono queste:
Perché apparentemente REINDEX riduce così tanto le dimensioni degli indici quando gli indici (o almeno l'indice della colonna della geometria) sono stati ricostruiti da zero? Devo accertarmi che la tabella sia stata aspirata / analizzata prima che gli indici vengano creati? La caduta dell'indice sulla chiave primaria non è un fattore in questo? Cosa mi sto perdendo?
ANALYZE
le dimensioni riportate diminuiscono.