[db.]table que correspondem à expressão expr. Ela está disponível apenas para a família de mecanismos de tabela *MergeTree.
Exemplos
A exclusão leve não exclui dados imediatamente
DELETE aguardam até que a marcação das linhas como excluídas seja concluída antes de retornar. Isso pode levar bastante tempo se o volume de dados for grande. Como alternativa, você pode executá-lo 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.
A mutação não exclui fisicamente as linhas que foram marcadas como excluídas; isso só acontece durante o próximo merge. Como resultado, é possível que, por um período indefinido, os dados não sejam de fato removidos do armazenamento e apenas fiquem marcados como excluídos.
Se você precisar garantir que seus dados sejam excluídos do armazenamento em um prazo previsível, considere usar a configuração de tabela min_age_to_force_merge_seconds. Ou você pode usar o comando ALTER TABLE … DELETE. Observe que excluir dados usando ALTER TABLE ... DELETE pode consumir recursos significativos, pois recria todas as partes afetadas.
Exclusão de grandes volumes de dados
TRUNCATE TABLE.
Se você espera realizar exclusões frequentes, considere usar uma chave de particionamento personalizada. Assim, você poderá 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
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. No entanto, há uma configuração do MergeTree lightweight_mutation_projection_mode para alterar esse comportamento.
Considerações de desempenho ao usar exclusão leve
SELECT.
O seguinte também pode impactar negativamente o desempenho da exclusão leve:
- Uma condição
WHEREcomplexa em uma consultaDELETE. - Se a fila de mutações estiver cheia de muitas outras mutações, isso pode causar problemas de desempenho, já que todas as mutações em uma tabela são executadas sequencialmente.
- A tabela afetada tem um número muito grande de partes de dados.
- Ter muitos dados em partes compactas. Em uma parte Compact, todas as colunas são armazenadas em um único arquivo.
Permissões para exclusão
DELETE exige o privilégio ALTER DELETE. Para habilitar instruções DELETE em uma tabela específica para um determinado usuário, execute o seguinte comando:
Como as exclusões leves funcionam internamente no ClickHouse
-
Uma “máscara” é aplicada às linhas afetadas
Quando uma consulta
DELETE FROM table ...é executada, o ClickHouse salva uma máscara em que cada linha é marcada como “existente” ou “excluída”. Essas linhas “excluídas” são omitidas das consultas subsequentes. No entanto, as linhas só são realmente removidas mais tarde, em merges subsequentes. Gravar essa máscara é muito mais leve do que o que é feito por uma consultaALTER TABLE ... DELETE. A máscara é implementada como uma coluna de sistema oculta_row_existsque armazenaTruepara todas as linhas visíveis eFalsepara 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 aTrue. -
As consultas
SELECTsão transformadas para incluir a máscara Quando uma coluna mascarada é usada em uma consulta, a consultaSELECT ... FROM table WHERE conditioné internamente estendida com o predicado sobre_row_existse transformada em:Em tempo de 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. -
As consultas
DELETEsão transformadas em consultasALTER TABLE ... UPDATEODELETE FROM table WHERE conditioné traduzido em uma mutaçãoALTER TABLE table UPDATE _row_exists = 0 WHERE condition. Internamente, essa mutação é executada em duas etapas:-
Um comando
SELECT count() FROM table WHERE conditioné executado para cada parte individual para determinar se ela foi afetada. -
Com base nos comandos acima, as partes afetadas passam pela mutação, e hardlinks são criados para as partes não afetadas. No caso de partes wide, a coluna
_row_existsde cada linha é atualizada, e os arquivos de todas as outras colunas recebem hardlinks. Para partes compact, todas as colunas são regravadas porque ficam armazenadas juntas em um único arquivo.
ALTER TABLE ... DELETEtradicional porque ele não regrava os arquivos de todas as colunas das partes afetadas. -
Um comando