Escolhendo uma estratégia de atualização
- Usar motores de tabela especializados que tratam as atualizações por meio de inserções
- Usar atualizações declarativas, como as instruções
UPDATE ... SETouALTER TABLE ... UPDATE
Quando usar motores de tabela especializados
Como os motores de tabela da família MergeTree fazem mesclagens de partes de dados em segundo plano, eles oferecem consistência eventual, e a palavra-chave
FINAL precisa ser usada para garantir a desduplicação adequada nesse período ao consultar a tabela.
Também há outros tipos de motores, mas estes são os mais usados.
Quando usar atualizações declarativas
Atualizações com motores de tabela especializados
ReplacingMergeTree
ReplacingMergeTree remove linhas duplicadas com a mesma chave de ordenação durante as mesclagens em segundo plano, mantendo apenas a versão mais recente.
FINAL ou uma lógica de consulta equivalente para obter resultados corretos e desduplicados. O modificador FINAL adiciona uma sobrecarga na consulta que varia de 21% a 550%, dependendo dos dados.
ReplacingMergeTree não pode atualizar valores da chave de ordenação. Ele também oferece suporte a uma coluna Deleted para exclusões lógicas.
Leia mais: guia do ReplacingMergeTree | referência do ReplacingMergeTree
CoalescingMergeTree
Nullable para que isso funcione como esperado. Assim como no ReplacingMergeTree, use FINAL para obter resultados corretos e coalescidos.
Este motor está disponível a partir da versão 25.6 do ClickHouse.
Leia mais: CoalescingMergeTree
CollapsingMergeTree
inserts podem ser usados para realizá-las, CollapsingMergeTree usa uma coluna Sign para informar ao ClickHouse como tratar as linhas durante as mesclagens. Se -1 for inserido na coluna de sinal, a linha será colapsada (excluída) quando emparelhada com uma linha +1 correspondente. As linhas a serem atualizadas são identificadas com base na chave de ordenação usada na cláusula ORDER BY ao criar a tabela.
ReplacingMergeTree, CollapsingMergeTree permite modificar os valores da chave de ordenação. Ele é especialmente adequado para operações reversíveis com semântica de cancelamento, como transações financeiras ou rastreamento de estado em jogos.
A abordagem de atualização acima exige que sua aplicação mantenha o estado no cliente para inserir a linha de cancelamento. Embora isso seja mais eficiente do ponto de vista do ClickHouse, pode ser complexo em escala. As consultas também precisam de agregação com multiplicação pelo sinal para produzir resultados corretos.
Atualizações declarativas
Mutações
ALTER TABLE ... UPDATE) reescrevem todas as partes que contêm linhas que satisfazem a expressão WHERE.
WHERE.
Não há atomicidade nesse processo.
As partes são substituídas por partes mutadas assim que ficam prontas, e uma consulta SELECT iniciada durante uma mutação verá dados de partes que já foram mutadas junto com dados de partes que ainda não foram mutadas.
Você pode acompanhar o estado do progresso por meio da tabela system.mutations.
Leia mais: ALTER TABLE UPDATE
Mutações on-the-fly
ALTER TABLE ... UPDATE, pode ser necessário esperar que elas sejam aplicadas por um processo em segundo plano para que os valores alterados apareçam nas suas consultas.
O ClickHouse oferece uma forma de mudar esse comportamento por meio de “mutações on-the-fly”.
Quando as mutações on-the-fly estão habilitadas, as linhas atualizadas são marcadas imediatamente, e as consultas SELECT subsequentes retornam automaticamente os valores alterados.
As mutações on-the-fly podem ser habilitadas para tabelas da família MergeTree ativando a configuração no nível da consulta apply_mutations_on_fly.
Exemplo
Exemplo
Vamos criar uma tabela e executar algumas mutações:Vamos verificar o resultado das atualizações com uma consulta Observe que os valores das linhas ainda não foram atualizados quando consultamos a nova tabela:Agora, vamos ver o que acontece quando habilitamos as mutações on-the-fly:A consulta
SELECT:SELECT agora retorna o resultado correto imediatamente, sem precisar esperar que as mutações sejam aplicadas:Impacto no desempenho
SELECT. No entanto, observe que as mutações ainda são materializadas de forma assíncrona em segundo plano, o que é um processo custoso.
Se o número de mutações enviadas exceder constantemente, ao longo de um determinado intervalo de tempo, o número de mutações processadas em segundo plano, a fila de mutações não materializadas que precisam ser aplicadas continuará crescendo. Isso acabará degradando o desempenho das consultas SELECT.
Sugerimos habilitar a configuração apply_mutations_on_fly junto com outras configurações no nível de MergeTree, como number_of_mutations_to_throw e number_of_mutations_to_delay, para limitar o crescimento infinito de mutações não materializadas.
Suporte a subconsultas e funções não determinísticas
mutations_max_literal_size_to_replace) são compatíveis. Apenas funções não determinísticas constantes são compatíveis (por exemplo, a função now()).
Esses comportamentos são controlados pelas seguintes configurações:
Atualizações leves
UPDATE e cria partes de patch imediatamente, sem esperar por merges. Os valores atualizados ficam visíveis de imediato nas consultas SELECT por meio da aplicação de patches, mas só são materializados fisicamente durante merges subsequentes. Isso torna as atualizações leves ideais para atualizar uma pequena porcentagem de linhas (até ~10% da tabela) com latência previsível. Benchmarks mostram que elas podem ser até 23x mais rápidas do que mutações.
A desvantagem é que as consultas SELECT têm uma sobrecarga ao aplicar patches, e as partes de patch contam para os limites de partes. Acima do limite de ~10%, a sobrecarga dos patches durante a leitura cresce proporcionalmente, tornando as mutações síncronas mais eficientes para atualizações maiores.
Leia mais: Lightweight UPDATE
Mutações on-the-fly
As mutações on-the-fly oferecem um mecanismo para atualizar linhas, de modo que consultasSELECT subsequentes retornem automaticamente os valores alterados sem precisar aguardar o processamento em segundo plano. Isso resolve, na prática, a limitação de atomicidade das mutações normais.
SELECT subsequentes precisam estar com a configuração apply_mutations_on_fly = 1 habilitada. As condições da mutação são armazenadas no ClickHouse Keeper, que mantém tudo em memória, e aplicadas on-the-fly durante as consultas.
Observe que uma mutação ainda é usada para atualizar os dados — ela só não é materializada imediatamente. A mutação ainda será aplicada em segundo plano como um processo assíncrono e acarreta a mesma sobrecarga elevada de uma mutação comum. As expressões que podem ser usadas com essa operação também são limitadas (consulte os detalhes).
Leia mais: Mutações on-the-fly