Estou pensando em usar CLUSTER para reordenar uma tabela por um índice. Entendo que essa recriação dos dados da tabela faz com que todos os índices existentes inchem ou sejam inúteis. Vi algumas indicações de que um REINDEX é necessário após um CLUSTER. Encontrei outras referências que indicam que CLUSTER faz um REINDEX. A documentação oficial não diz nada sobre o REINDEX fazer parte do CLUSTER ou ser necessário (embora isso sugira a execução do ANALYZE após o CLUSTER)
Alguém pode definitivamente (ou seja, com algum tipo de referência a documentos oficiais) dizer se é necessário ou não um REINDEX após um CLUSTER?
postgresql
ÁRVORE
fonte
fonte
cluster
realoca as linhas, portanto, será necessário atualizar as informações do índice de qualquer maneira.Respostas:
Você não precisa reindexar, porque
CLUSTER
efetivamente faz isso por você.Mais especificamente,
CLUSTER
bloqueia a tabela de origem e cria uma nova cópia ordenada de acordo com o índice de destino. Ele cria índices na nova cópia e substitui a tabela e os índices antigos pelos novos.Observe que isso também ocorre
VACUUM FULL
no 9.0+.Se você está vendo uma discussão sugerindo que os
CLUSTER
índices de inchaço podem ser pessoas que estão assumindo queCLUSTER
funciona como pré-9.0VACUUM FULL
. Você também pode estar vendo e interpretando mal as discussões que mencionam o inchaço do índice causado pelaVACUUM FULL
implementação antiga e sugeremCLUSTER
como alternativa .Isso está implícito na documentação :
O que não diz, mas deveria, é que essas cópias temporárias substituem a tabela original . (Negrito meu).
fonte
CLUSTER
se não reescrever os índices, e exame dos arquivos reais nobase/
mostrará claramente novasrelfilenode
s. Parece que você está se preocupando com problemas que ainda não possui.Estou com um a_horse_with_no_name nisto: você não precisa recriar os índices. Além disso, a
CLUSTER
documentação não menciona, também podemos consultar aREINDEX
página:Claramente,
CLUSTER
não se enquadra em nenhum desses casos.E há uma pequena frase nos
CLUSTER
documentos:Isso sugere que, assim como a própria tabela, os índices também são reordenados durante o processo, tornando inútil a reindexação.
fonte
Encontre uma referência, na seção Recuperando espaço em disco .
fonte
Analisando todas as respostas, na minha opinião, a maneira correta de fazer isso é reindexar ANTES do cluster. Como a documentação não informa se o cluster faz ou não uma reindexação e apenas uma cópia do índice, ordenada ou não, acho que um índice indexado resultará em uma tabela em cluster melhor. Depois disso, uma análise concluirá o trabalho. Um vácuo cheio antes de tudo parece ser inútil, a menos que cluster e / ou reindexo não liberem tuplas mortas
fonte
CLUSTER
eVACUUM FULL
produz uma nova tabela física - simplesmente não pode haver mortos depois dela. O espaço usado pela cópia antiga será liberado ao final da operação.