Limitações
Status incerto da inserção
Limite da janela de desduplicação
*_deduplication_window outras operações de inserção ocorrerem durante a sequência de tentativas, a desduplicação pode não funcionar como esperado. Nesse caso, os mesmos dados podem ser inseridos várias vezes.
Habilitando a desduplicação de inserção em tentativas repetidas
Desduplicação de inserção para tabelas
*MergeTree oferecem suporte à desduplicação durante a inserção.
Para motores *ReplicatedMergeTree, a desduplicação de inserção é habilitada por padrão e controlada pelas configurações replicated_deduplication_window e replicated_deduplication_window_seconds. Para motores *MergeTree não replicados, a desduplicação é controlada pela configuração non_replicated_deduplication_window.
As configurações acima determinam os parâmetros do log de desduplicação de uma tabela. O log de desduplicação armazena um número finito de block_ids, que determinam como a desduplicação funciona (veja abaixo).
Desduplicação de inserção no nível da consulta
insert_deduplicate=1 habilita a desduplicação no nível da consulta. Observe que, se você inserir dados com insert_deduplicate=0, esses dados não poderão ser desduplicados, mesmo que você repita a inserção com insert_deduplicate=1. Isso acontece porque os block_ids não são gravados para os blocos durante inserções com insert_deduplicate=0.
Como funciona a desduplicação de inserção
*MergeTree, cada bloco recebe um block_id exclusivo, que é um hash dos dados desse bloco. Esse block_id é usado como chave exclusiva para a operação de inserção. Se o mesmo block_id for encontrado no log de desduplicação, o bloco será considerado duplicado e não será inserido na tabela.
Essa abordagem funciona bem quando as inserções contêm dados diferentes. No entanto, se os mesmos dados forem inseridos intencionalmente várias vezes, você precisará usar a configuração insert_deduplication_token para controlar o processo de desduplicação. Essa configuração permite especificar um token exclusivo para cada inserção, que o ClickHouse usa para determinar se os dados são duplicados.
Para consultas INSERT ... VALUES, a divisão dos dados inseridos em blocos é determinística e definida pelas configurações. Portanto, você deve repetir as inserções com os mesmos valores de configuração da operação inicial.
Para consultas INSERT ... SELECT, é importante que a parte SELECT da consulta retorne os mesmos dados na mesma ordem em cada operação. Observe que isso é difícil de alcançar na prática. Para garantir uma ordem estável dos dados nas novas tentativas, defina uma cláusula ORDER BY ALL na parte SELECT da consulta. No momento, você precisa usar exatamente ORDER BY ALL na consulta. O suporte a ORDER BY ainda não foi implementado, e a parte SELECT da consulta não seria considerada estável. Tenha em mente que a tabela selecionada pode ser atualizada entre as tentativas — os dados do resultado podem ter mudado, e a desduplicação não ocorrerá. Além disso, ao inserir grandes volumes de dados, é possível que o número de blocos após as inserções ultrapasse a janela do log de desduplicação, e o ClickHouse não conseguirá desduplicar os blocos.
No momento, o comportamento de INSERT ... SELECT é controlado pela configuração insert_select_deduplicate. Essa configuração determina se a desduplicação é aplicada aos dados inseridos usando consultas INSERT ... SELECT. Consulte a documentação vinculada para detalhes e exemplos de uso.
Desduplicação de inserção com visões materializadas
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views.
Com a configuração insert_deduplicate=1 habilitada, os dados inseridos passam por desduplicação na tabela de origem. A configuração deduplicate_blocks_in_dependent_materialized_views=1 também habilita a desduplicação nas tabelas dependentes. Você precisa habilitar ambas se quiser desduplicação completa.
Ao inserir blocos em tabelas sob visões materializadas, o ClickHouse calcula o block_id aplicando hash a uma string que combina os block_ids da tabela de origem com identificadores adicionais. Isso garante uma desduplicação precisa dentro das visões materializadas, permitindo distinguir os dados com base na inserção original, independentemente de quaisquer transformações aplicadas antes de chegarem à tabela de destino sob a visão materializada.
Exemplos
Blocos idênticos após transformações em uma visão materializada
dst. 2 blocos do select — 2 partes ao inserir. As partes contêm dados diferentes.
mv_dst. Essas partes contêm os mesmos dados, no entanto, não são deduplicadas.
dst quanto para mv_dst.
Blocos idênticos durante a inserção
dst. No entanto, vemos que apenas um bloco foi inserido na tabela dst. Isso ocorreu porque o segundo bloco foi desduplicado. Ele tem os mesmos dados e a chave de desduplicação block_id, calculada como um hash dos dados inseridos. Esse comportamento não era o esperado. Casos assim são raros, mas teoricamente podem acontecer. Para lidar corretamente com esses casos, o usuário precisa fornecer um insert_deduplication_token. Vamos corrigir isso com os exemplos a seguir:
Blocos idênticos durante a inserção com insert_deduplication_token
insert_deduplication_token tem prioridade: o ClickHouse não usa o hash dos dados quando insert_deduplication_token é fornecido.
Diferentes operações de inserção produzem os mesmos dados após a transformação na tabela subjacente da visão materializada
mv_dst. Os dados não são deduplicados porque os dados de origem eram diferentes.
Inserções de diferentes visões materializadas em uma única tabela subjacente com dados equivalentes
mv_dst (como esperado).
dst e mv_dst.