Skip to main content
O motor difere de MergeTree por remover entradas duplicadas com o mesmo valor da chave de ordenação (cláusula ORDER BY da tabela, não PRIMARY KEY). A desduplicação de dados ocorre apenas durante uma mesclagem. As mesclagens ocorrem em segundo plano, em um momento desconhecido, portanto não é possível planejá-las. Parte dos dados pode permanecer sem processamento. Embora seja possível executar uma mesclagem não programada usando a consulta OPTIMIZE, não dependa disso, porque a consulta OPTIMIZE lerá e gravará uma grande quantidade de dados. Assim, ReplacingMergeTree é adequado para remover dados duplicados em segundo plano a fim de economizar espaço, mas não garante a ausência de duplicatas.
Um guia detalhado sobre ReplacingMergeTree, incluindo melhores práticas e como otimizar o desempenho, está disponível aqui.

Criar uma tabela

Para ver uma descrição dos parâmetros da solicitação, consulte a descrição da instrução.
A unicidade das linhas é determinada pela cláusula ORDER BY da tabela, não pela PRIMARY KEY.

Parâmetros do ReplacingMergeTree

ver

ver — coluna com o número da versão. Tipo UInt*, Date, DateTime ou DateTime64. Parâmetro opcional. Durante a mesclagem, o ReplacingMergeTree mantém apenas uma entre todas as linhas com a mesma chave de ordenação:
  • A última na seleção, se ver não estiver definido. Uma seleção é um conjunto de linhas em um conjunto de partes que participam da mesclagem. A parte criada mais recentemente (o último insert) será a última na seleção. Assim, após a desduplicação, a última linha do insert mais recente permanecerá para cada chave de ordenação exclusiva.
  • A de versão máxima, se ver for especificado. Se ver for o mesmo para várias linhas, será usada para elas a regra “se ver não for especificado”, isto é, a linha inserida mais recentemente permanecerá.
Exemplo:

is_deleted

is_deleted — Nome de uma coluna usada durante uma mesclagem para determinar se os dados nesta linha representam o estado ou devem ser excluídos; 1 é uma linha “excluída”, 0 é uma linha de “estado”. Tipo de dados da coluna — UInt8.
is_deleted só pode ser habilitado quando ver é usado.Independentemente da operação realizada nos dados, a versão deve ser incrementada. Se duas linhas inseridas tiverem o mesmo número de versão, a última linha inserida será mantida.Por padrão, o ClickHouse manterá a última linha de uma chave, mesmo que ela seja uma linha de exclusão. Isso garante que quaisquer linhas futuras com versões menores possam ser inseridas com segurança, e a linha de exclusão ainda será aplicada.Para remover permanentemente essas linhas de exclusão, habilite a configuração da tabela allow_experimental_replacing_merge_with_cleanup e então:
  1. Defina as configurações da tabela enable_replacing_merge_with_cleanup_for_min_age_to_force_merge, min_age_to_force_merge_on_partition_only e min_age_to_force_merge_seconds. Se todas as partes em uma partição forem mais antigas que min_age_to_force_merge_seconds, o ClickHouse fará a mesclagem de todas elas em uma única parte e removerá quaisquer linhas de exclusão.
  2. Execute manualmente OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP.
Exemplo:

Cláusulas da consulta

Ao criar uma tabela ReplacingMergeTree, são necessárias as mesmas cláusulas exigidas na criação de uma tabela MergeTree.

Desduplicação em tempo de consulta & FINAL

Durante a mesclagem, o ReplacingMergeTree identifica linhas duplicadas usando os valores das colunas de ORDER BY (usadas para criar a tabela) como identificador único e mantém apenas a versão mais alta. No entanto, isso oferece apenas correção eventual — não garante que as linhas serão desduplicadas, e você não deve depender disso. Portanto, as consultas podem produzir respostas incorretas porque linhas de atualização e exclusão são consideradas nas consultas. Para obter respostas corretas, os usuários precisarão complementar as mesclagens em segundo plano com desduplicação em tempo de consulta e remoção de linhas excluídas. Isso pode ser feito usando o operador FINAL. Por exemplo, considere o exemplo a seguir:
Consultar sem FINAL gera uma contagem incorreta (o resultado exato varia conforme as mesclagens):
Adicionar FINAL gera o resultado correto:
Para mais detalhes sobre FINAL, inclusive sobre como otimizar seu desempenho, recomendamos a leitura do nosso guia detalhado sobre ReplacingMergeTree.
Última modificação em 23 de julho de 2026