Eu tenho uma tabela com 200 GB de tamanho ocupado por dados e 180 GB de tamanho pelos 6 índices nele. Como está inchado em 30%, quero recuperar o espaço indesejado ocupado por ele. Está agrupado no job_id_id
índice x.
Então, para recuperar o espaço, preciso usar cluster
comando ou vacuum full
comando?
Qual é a diferença entre esses dois comandos?
A
vacuum full
ordem por alguma coluna é igual aocluster
comando?O índice é recriado nos dois comandos?
No meu caso, qual será mais rápido?
A versão do banco de dados PostgreSQL é 9.1
Respostas:
Para verificar o que
CLUSTER
aconteceu, tirei uma tabela da minha de um experimento anterior que continha basicamente os primeiros 10 milhões de números inteiros positivos. Eu já excluí algumas linhas e também existe uma outra coluna, mas elas afetam apenas o tamanho real da tabela, portanto não é tão interessante.Primeiro, tendo corrido
VACUUM FULL
sobre a mesafka
, tomei seu tamanho:Então vamos ver a ordem física dos dados desde o início da tabela:
Agora vamos excluir algumas linhas:
Depois disso, o tamanho da tabela relatada não foi alterado. Então, vamos ver agora o que
CLUSTER
faz:Após a operação, o tamanho da tabela mudou de 338 para 296 MB. Na
ctid
coluna, que descreve o local físico da tupla na página, você também vê que não há espaços onde a correspondência de linhaid = 5
costumava estar.À medida que as tuplas foram reordenadas, os índices deveriam ter sido recriados para que apontassem para os locais corretos.
Portanto, parece que a diferença é que
VACUUM FULL
não ordena as linhas. Até onde eu sei, há alguma diferença no mecanismo que os dois comandos usam, mas, do ponto de vista prático, essa parece ser a principal (apenas?) Diferença.fonte
ctid
coluna. Acontece que é uma coluna do sistema que descreve a localização física da linha em sua tabela. postgresql.org/docs/current/ddl-system-columns.htmlhttp://www.postgresql.org/docs/9.1/static/sql-vacuum.html
http://www.postgresql.org/docs/9.1/static/sql-cluster.html
também interessante: is-a-reindex-required-after-cluster
Mas talvez tudo o que você precise seja simples,
REINDEX
que reconstrua um índice usando os dados armazenados na tabela do índice, substituindo a cópia antiga do índice.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
fonte