No início da manhã, todos os dias, um trabalho do pgAgent atualiza o conteúdo da tabela A da tabela B no meu banco de dados PostgreSQL 8.4. A Tabela A contém cerca de 140k registros em 91 colunas e possui dois índices - um como parte da PRIMARY KEY e o outro um índice GIST em uma coluna de geometria do POINT PostGIS.
Para acelerar o processo, o trabalho solta o índice na coluna de geometria, antes de excluir os registros na tabela A e inserir os registros da tabela B, o índice é recriado. Isso tudo sendo feito, o daemon de autovacuum começa a funcionar quando lhe apetecer (depois de dez minutos aproximadamente, comparando as estatísticas da tarefa e as estatísticas da tabela para o tempo de conclusão da tarefa e o tempo de execução do autovacuum).
Ao verificar a mesa esta manhã, depois que tudo isso aconteceu, as estatísticas da tabela me disseram que o tamanho da tabela era 272MB, o tamanho da tabela TOAST era 8192bytes e o tamanho do índice era 23MB. Isso parecia muito grande, então eu emiti um comando REINDEX na tabela e o tamanho do índice caiu para 9832kB.
Minha (s) pergunta (s) é esta:
Por que o REINDEX aparentemente reduz tanto o tamanho dos índices quando os índices (ou pelo menos o índice da coluna geométrica) foram criados novamente do zero? Devo garantir que a tabela tenha sido aspirada / analisada antes da criação dos índices? A queda do índice na chave primária não é um fator disso? o que estou perdendo?
ANALYZE
o tamanho relatado também diminui.