Skip to main content
A instrução de exclusão leve remove linhas da tabela [db.]table que correspondem à expressão expr. Ela está disponível apenas para a família *MergeTree de mecanismos de tabela.
É chamado de “exclusão leve” para diferenciá-lo do comando ALTER TABLE … DELETE, que é uma operação pesada.

Exemplos

exclusão leve DELETE não exclui os dados imediatamente

A exclusão leve DELETE marca as linhas como excluídas sem removê-las imediatamente do armazenamento. Por padrão, ela usa uma mutação. Também pode usar partes de patch, dependendo da configuração lightweight_delete_mode. No modo padrão baseado em mutações, as instruções DELETE aguardam a conclusão da marcação das linhas como excluídas antes de retornar. Isso pode levar muito tempo se o volume de dados for grande. Como alternativa, você pode executá-la de forma assíncrona em segundo plano usando a configuração lightweight_deletes_sync. Se ela estiver desabilitada, a instrução DELETE retornará imediatamente, mas os dados ainda poderão ficar visíveis para consultas até que a mutação em segundo plano seja concluída. Em ambos os modos, as linhas excluídas permanecem no armazenamento até a limpeza. As mesclagens em segundo plano normalmente as removem das partes de dados afetadas. Para aplicar explicitamente a máscara de exclusão, use ALTER TABLE ... APPLY DELETED MASK, que executa uma mutação de alto custo. Se você precisar garantir que seus dados sejam excluídos do armazenamento em um prazo previsível, considere usar a configuração da tabela min_age_to_force_merge_seconds. Ou use o comando ALTER TABLE … DELETE. Observe que excluir dados com ALTER TABLE ... DELETE pode consumir recursos significativos, pois recria todas as partes afetadas.

Escolha o modo de exclusão

A configuração lightweight_delete_mode permite escolher entre exclusões baseadas em mutações (o padrão) e atualizações leves que gravam partes de patch com _row_exists = 0 para as linhas excluídas. As consultas aplicam esses patches antes da remoção física dos dados. Consulte a referência da configuração para ver os modos disponíveis e os requisitos das atualizações leves para verificar os pré-requisitos. Quando são usadas partes de patch, lightweight_deletes_sync não aguarda as demais réplicas; em ReplicatedMergeTree, elas ainda podem retornar linhas excluídas até receberem o patch.

Exclusão de grandes volumes de dados

Exclusões em grande volume podem afetar negativamente o desempenho do ClickHouse. Se você estiver tentando excluir todas as linhas de uma tabela, considere usar o comando TRUNCATE TABLE. Se você espera fazer exclusões frequentes, considere usar uma chave de particionamento personalizada. Você poderá então usar o comando ALTER TABLE ... DROP PARTITION para remover rapidamente todas as linhas associadas a essa partição.

Limitações da exclusão leve

Exclusões leves com projeções

Por padrão, DELETE não funciona em tabelas com projeções. Isso ocorre porque linhas de uma projeção podem ser afetadas por uma operação DELETE. Porém, há uma configuração do MergeTree, lightweight_mutation_projection_mode, para alterar esse comportamento.

Considerações de desempenho ao usar exclusão leve

Excluir grandes volumes de dados com a instrução de exclusão leve pode afetar negativamente o desempenho das consultas SELECT. Os itens a seguir também podem afetar negativamente o desempenho da exclusão leve:
  • Uma condição WHERE complexa em uma consulta DELETE.
  • Para exclusões baseadas em mutações, uma fila de mutações grande: as mutações em uma tabela são executadas sequencialmente.
  • A tabela afetada tem um número muito grande de partes de dados.
  • Ao usar exclusões baseadas em mutações, ter muitos dados em partes compactas. Em uma parte compacta, todas as colunas são armazenadas em um único arquivo e precisam ser regravadas juntas.

Permissões para exclusão

DELETE requer o privilégio ALTER DELETE. Para habilitar instruções DELETE em uma tabela específica para um determinado usuário, execute o comando a seguir:

Como as exclusões leves funcionam internamente no ClickHouse

  1. Uma “máscara” é aplicada às linhas afetadas Quando uma consulta DELETE FROM table ... é executada, o ClickHouse salva uma máscara na qual cada linha é marcada como “existente” ou “excluída”. Essas linhas “excluídas” são omitidas das consultas subsequentes. No entanto, as linhas são removidas fisicamente mais tarde, normalmente durante as mesclagens em segundo plano. Gravar essa máscara é muito mais leve do que o que é feito por uma consulta ALTER TABLE ... DELETE. A máscara é implementada como uma coluna de sistema oculta _row_exists que armazena True para todas as linhas visíveis e False para as excluídas. Essa coluna só está presente em uma parte se algumas linhas dessa parte tiverem sido excluídas. Essa coluna não existe quando uma parte tem todos os valores iguais a True.
  2. As consultas SELECT são transformadas para incluir a máscara Quando uma coluna mascarada é usada em uma consulta, a consulta SELECT ... FROM table WHERE condition é internamente estendida com o predicado em _row_exists e transformada em:
    No momento da execução, a coluna _row_exists é lida para determinar quais linhas não devem ser retornadas. Se houver muitas linhas excluídas, o ClickHouse pode determinar quais grânulos podem ser totalmente ignorados ao ler o restante das colunas.
  3. As consultas DELETE atualizam a máscara usando o modo selecionado Com partes de patch, DELETE FROM table WHERE condition é traduzido em UPDATE table SET _row_exists = 0 WHERE condition. As partes de patch resultantes armazenam as alterações na máscara das linhas excluídas e são aplicadas durante a leitura e a mesclagem dos dados. Com o modo padrão alter_update, DELETE FROM table WHERE condition é traduzido em uma mutação ALTER TABLE table UPDATE _row_exists = 0 WHERE condition. Internamente, essa mutação é executada em duas etapas:
    1. Um comando SELECT count() FROM table WHERE condition é executado para cada parte individual para determinar se a parte foi afetada.
    2. Com base nos comandos acima, as partes afetadas são então modificadas, e links físicos são criados para as partes não afetadas. No caso de partes no formato wide, a coluna _row_exists de cada linha é atualizada, e os arquivos de todas as outras colunas recebem links físicos. Para partes compactas, todas as colunas são regravadas porque ficam armazenadas juntas em um único arquivo.
    Pelas etapas acima, podemos ver que a exclusão leve, usando a técnica de mascaramento, melhora o desempenho em relação ao ALTER TABLE ... DELETE tradicional porque não regrava os arquivos de todas as colunas das partes afetadas.