É necessário um REINDEX após o CLUSTER?

12

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?

ÁRVORE
fonte
2
Eu não acho que seja necessário. clusterrealoca as linhas, portanto, será necessário atualizar as informações do índice de qualquer maneira.
a_horse_with_no_name
Sim, mas a teoria em metade das discussões que encontrei é que isso faz com que o índice fique inchado.
ÁRVORE

Respostas:

12

Você não precisa reindexar, porque CLUSTERefetivamente faz isso por você.

Mais especificamente, CLUSTERbloqueia 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 FULLno 9.0+.

Se você está vendo uma discussão sugerindo que os CLUSTERíndices de inchaço podem ser pessoas que estão assumindo que CLUSTERfunciona como pré-9.0 VACUUM FULL. Você também pode estar vendo e interpretando mal as discussões que mencionam o inchaço do índice causado pela VACUUM FULLimplementação antiga e sugerem CLUSTERcomo alternativa .

Isso está implícito na documentação :

é criada uma cópia temporária da tabela que contém os dados da tabela na ordem do índice. Cópias temporárias de cada índice na tabela também são criadas . Portanto, você precisa de espaço livre no disco pelo menos igual à soma do tamanho da tabela e dos tamanhos do índice

O que não diz, mas deveria, é que essas cópias temporárias substituem a tabela original . (Negrito meu).

Craig Ringer
fonte
1
Você tem alguma referência de que CLUSTER substitui índices?
TREE
1
@TREE Adicionado. Os documentos não informam explicitamente que a tabela e os índices temporários substituem os originais, mas você verá que é o caso se você realmente olhar o diretório de dados antes / depois de um CLUSTER ou se examinar o código-fonte.
Craig Ringer
Eu testei isso e, pelo menos no meu cenário de teste, o tamanho do arquivo de índice foi reduzido. Mas este é apenas um cenário, e pode haver muitas variáveis ​​que afetam o comportamento (número de índices, tamanho total do disco, etc.), por isso não posso confiar em um teste simples.
ÁRVORE
1
@TREE Para garantir absoluta compreensão do comportamento em todas as circunstâncias possíveis, você precisará ler o código-fonte. Tudo o que posso dizer é que eu não estou ciente de qualquer situação em que CLUSTERse não reescrever os índices, e exame dos arquivos reais no base/mostrará claramente novas relfilenodes. Parece que você está se preocupando com problemas que ainda não possui.
Craig Ringer
8

Estou com um a_horse_with_no_name nisto: você não precisa recriar os índices. Além disso, a CLUSTERdocumentação não menciona, também podemos consultar a REINDEXpágina:

Existem vários cenários para usar o REINDEX:

  • Um índice foi corrompido e não contém mais dados válidos. Embora, em teoria, isso nunca deva acontecer, na prática os índices podem ser corrompidos devido a bugs de software ou falhas de hardware. O REINDEX fornece um método de recuperação.

  • Um índice ficou "inchado", por conter muitas páginas vazias ou quase vazias. Isso pode ocorrer com índices de árvore B no PostgreSQL sob certos padrões de acesso incomuns. O REINDEX fornece uma maneira de reduzir o consumo de espaço do índice gravando uma nova versão do índice sem as páginas inativas. Consulte a Seção 23.2 para obter mais informações.

  • Você alterou um parâmetro de armazenamento (como fator de preenchimento) para um índice e deseja garantir que a alteração tenha efeito total.

  • Uma compilação de índice com a opção CONCURRENTLY falhou, deixando um índice "inválido". Esses índices são inúteis, mas pode ser conveniente usar o REINDEX para reconstruí-los. Observe que o REINDEX não executará uma compilação simultânea. Para criar o índice sem interferir na produção, você deve eliminar o índice e reemitir o comando CREATE INDEX CONCURRENTLY.

Claramente, CLUSTERnão se enquadra em nenhum desses casos.

E há uma pequena frase nos CLUSTERdocumentos:

[durante o armazenamento em cluster] Cópias temporárias de cada índice na tabela também são criadas.

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.

dezso
fonte
A sugestão está certamente lá, e os testes parecem confirmar isso. Eu me sentiria melhor contando com esse comportamento se os documentos dissessem que os índices foram recriados (permanentemente).
TREE
2
Vejo material para um patch de documento aqui. O manual deve ser mais explícito sobre a recriação de índices.
Erwin Brandstetter
A minha suspeita neste momento é que os desenvolvedores não querem documentar oficialmente esse comportamento porque não querem estar permanentemente vinculados a essa implementação.
ÁRVORE
@TREE: há muitas alterações de recursos entre as versões e os documentos são alterados (principalmente) de acordo. Presumivelmente, as especificações também mudam :), então não vejo empate em lugar algum.
Dez12
@dezso True, mas eles relutam em remover a funcionalidade documentada. Dada a qualidade da documentação em geral, ainda suponho que a omissão desse comportamento seja intencional.
ÁRVORE
5

Encontre uma referência, na seção Recuperando espaço em disco .

Se você possui uma tabela e precisa recuperar o excesso de espaço em disco que ocupa, precisará usar VACUUM FULL, ou alternativamente CLUSTER ou uma das variantes de reescrita de tabelas de ALTER TABLE. Esses comandos reescrevem uma nova cópia inteira da tabela e criam novos índices para ela.

ÁRVORE
fonte
-3

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

Aislan Luiz Wendling
fonte
Como eu mencionei na resposta aceita, a documentação não dizer que os índices serão reconstruídos, não apenas na página sobre o comando CLUSTER.
TREE
E produz CLUSTERe VACUUM FULLproduz 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.
Dezso
De fato. Recrie a tabela e todos os índices. Mas tenho uma dúvida sobre o índice que o Cluster usa para reordenar a tabela. Será reindexado primeiro ou será usado para reordenar a tabela como está? E depois disso o índice é recriado? Porque um índice problemático pode gerar alguns problemas ...
Aislan Luiz Wendling