Skip to main content

Mutações on-the-fly

Quando as mutações on-the-fly estão habilitadas, as linhas atualizadas são marcadas como atualizadas imediatamente, e as consultas SELECT subsequentes retornam automaticamente os valores alterados. Quando as mutações on-the-fly não estão habilitadas, talvez seja necessário aguardar que suas mutações sejam aplicadas por um processo em segundo plano para que os valores alterados sejam exibidos. As mutações on-the-fly podem ser habilitadas para tabelas da família MergeTree ativando a configuração em nível de consulta apply_mutations_on_fly.

Exemplo

Vamos criar uma tabela e executar algumas mutações:
Vamos verificar o resultado das atualizações com uma consulta SELECT:
Observe que os valores das linhas ainda não foram atualizados ao consultarmos a nova tabela:
Vamos agora ver o que acontece quando ativamos as mutações on-the-fly:
A consulta SELECT agora retorna o resultado correto imediatamente, sem precisar esperar que as mutações sejam aplicadas:

Impacto no desempenho

Quando as mutações on-the-fly estão habilitadas, as mutações não são materializadas imediatamente, mas são aplicadas apenas durante consultas SELECT. No entanto, observe que as mutações ainda são materializadas de forma assíncrona em segundo plano, o que é um processo pesado. Se o número de mutações enviadas exceder constantemente, ao longo de algum 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 juntamente 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 indefinido das mutações não materializadas.

Suporte a subconsultas e funções não determinísticas

Mutações on-the-fly têm suporte limitado para subconsultas e funções não determinísticas. Só há suporte para subconsultas escalares com resultado de tamanho razoável (controlado pela configuração mutations_max_literal_size_to_replace). Só há suporte para funções não determinísticas constantes (por exemplo, a função now()). Esses comportamentos são controlados pelas seguintes configurações:
  • mutations_execute_nondeterministic_on_initiator - se verdadeiro, as funções não determinísticas são executadas na réplica iniciadora e substituídas como literais nas consultas UPDATE e DELETE. Valor padrão: false.
  • mutations_execute_subqueries_on_initiator - se verdadeiro, as subconsultas escalares são executadas na réplica iniciadora e substituídas como literais nas consultas UPDATE e DELETE. Valor padrão: false.
  • mutations_max_literal_size_to_replace - O tamanho máximo, em bytes, dos literais serializados a serem substituídos nas consultas UPDATE e DELETE. Valor padrão: 16384 (16 KiB).
Última modificação em 3 de julho de 2026