Problema
- Atomicidade em uma única tabela para carga em massa: Uma abordagem comum é inserir em chaves parciais temporárias, depois copiar os registros para a chave real e excluir os registros temporários. Essa abordagem tem baixo desempenho — especialmente a etapa de exclusão, que pode consumir mais de 90% do tempo total da operação.
- Consistência entre múltiplas tabelas: Quando um pipeline carrega a Tabela A com sucesso, mas falha na Tabela B, a Tabela A já foi confirmada e não pode ser revertida. Analistas que fazem consultas nas duas tabelas veem dados fora de sincronia.
Contexto
INSERT for bem-sucedido, todas as linhas desse bloco ficarão visíveis; se falhar, nenhuma ficará.
No entanto, não há nenhum mecanismo nativo para fazer o commit de dados de forma atômica em várias inserções ou em várias tabelas.
Os comandos de manipulação de partição (MOVE PARTITION TO TABLE, REPLACE PARTITION, ATTACH PARTITION FROM) operam no nível dos metadados quando as tabelas de origem e de destino compartilham a mesma política de armazenamento.
Isso significa que eles são executados quase instantaneamente, independentemente do volume de dados, o que os torna ideais como base para padrões de troca atômica.
Solução recomendada
Passo a passo da atomicidade em uma única tabela
Crie uma tabela de staging
Use o mesmo esquema, a mesma chave de partição,ORDER BY e a mesma política de armazenamento da tabela de produção.Insira dados na tabela de staging
Execute o insert na tabela de staging em vez da tabela de produção.Se o insert falhar, trunque e tente novamente
Trunque a tabela de staging e execute a carga novamente. Nenhum dado de produção terá sido afetado.Se o insert for bem-sucedido, mova as partições para produção
Para mover os dados para produção e removê-los da tabela de staging, useMOVE PARTITION.ATTACH PARTITION.Limpe a tabela de staging
Quando todas as partições tiverem sido movidas, trunque a tabela de staging para deixá-la vazia para a próxima carga.Consistência entre múltiplas tabelas
Requisitos e restrições
MOVE PARTITION TO TABLE, REPLACE PARTITION e ATTACH PARTITION FROM, as tabelas de origem e de destino devem ter:
- A mesma estrutura de colunas
- A mesma chave de partição, a mesma chave
ORDER BYe a mesma chave primária - A mesma política de armazenamento
- A tabela de destino deve incluir todos os índices e projeções da tabela de origem
Exemplo
Referências
- Manipulação de partições e partes
- Para saber mais sobre essa estratégia, consulte o post do blog Acelerando grandes cargas de dados no ClickHouse - Parte 3: Como tornar uma grande carga de dados resiliente.