Percebi que o clustering pode levar muito tempo e bloquear a tabela completamente, mesmo para leituras.
Tabelas organizadas por índice e clustering incremental seriam perfeitos, mas infelizmente eles não são suportados pelo PostgreSQL.
Agora eu percebo que ele também bloqueia as tabelas das réplicas, então aparentemente não há uma maneira de cluster sem ter muito tempo de inatividade?
A configuração rds.logical_replication
para 1
instâncias mestre e de réplica não ajudou.
Eu gostaria de agrupar quatro grandes mesas toda semana para um melhor desempenho.
Um problema em permitir que as consultas operem na tabela enquanto ela está sendo CLUSTERED (ou VACUUM FULL) é que mesmo as consultas que são apenas de seleção da perspectiva do usuário ainda podem gravar na tabela de maneiras não visíveis ao usuário, para definir bits de dica e limpar após transações revertidas, por exemplo.
Você pode configurar duas réplicas, uma que tenha a reprodução pausada antes do início da operação do cluster de tabela e, portanto, esteja aberta para leitores durante o CLUSTER, e outra que tenha permissão para reproduzir normalmente. Então, uma vez que o CLUSTER é feito, todos mudam da réplica pausada para a outra, para que a pausada possa se atualizar. Se você pode tolerar o uso de uma réplica que ficou para trás por horas é outra questão.
Existem projetos que farão agrupamento online de tabelas, como pg_reorg e pg_repack . Eles não fazem parte do núcleo do PostgreSQL, mas provavelmente valem a pena dar uma olhada. Não os usei em produção, mas principalmente porque não tenho necessidade de produção para eles.
Ainda outra opção seria particionar as tabelas. Em seguida, cada partição pode ser reclusterizada separadamente e talvez você não precise fazer o clustering se as restrições de partição realizarem a mesma coisa que o clustering - gerando padrões de E/S mais eficientes para verificações parciais.