Estou tentando entender melhor as diferenças entre os comandos DELETE
e . TRUNCATE
Minha compreensão dos internos é algo como:
DELETE
-> o mecanismo de banco de dados encontra e remove a linha das páginas de dados relevantes e todas as páginas de índice onde a linha é inserida. Assim, quanto mais índices, mais demora a exclusão.
TRUNCATE
-> simplesmente remove todas as páginas de dados da tabela em massa, tornando esta uma opção mais eficiente para excluir o conteúdo de uma tabela.
Supondo que o acima esteja correto (por favor, corrija-me se não):
- Como diferentes modos de recuperação afetam cada instrução? Se houver algum efeito
- Ao excluir, todos os índices são verificados ou apenas aqueles onde a linha está? Eu diria que todos os índices são verificados (e não procurados?)
- Como os comandos são replicados? O comando SQL é enviado e processado em cada assinante? Ou o MSSQL é um pouco mais inteligente do que isso?
Sim, embora existam duas opções aqui. As linhas podem ser excluídas de índices não clusterizados linha por linha pelo mesmo operador que executa as exclusões da tabela base. Isso é conhecido como um plano de atualização estreito (ou por linha):
Ou, as exclusões de índice não clusterizado podem ser executadas por operadores separados, um por índice não clusterizado. Nesse caso (conhecido como plano de atualização amplo ou por índice), o conjunto completo de ações é armazenado em uma tabela de trabalho (spool ansioso) antes de ser repetido uma vez por índice, geralmente classificado explicitamente pelas chaves do índice não clusterizado específico para incentivar uma sequência padrão de acesso.
Sim.
TRUNCATE TABLE
é mais eficiente por vários motivos:A exclusão é sempre totalmente registrada (cada linha excluída é registrada no log de transações). Existem algumas pequenas diferenças no conteúdo dos registros de log se o modelo de recuperação for diferente de
FULL
, mas isso ainda é um log tecnicamente completo.Excluir uma linha em um índice (usando os planos de atualização estreito ou amplo mostrados anteriormente) é sempre um acesso por chave (uma busca). A varredura de todo o índice para cada linha excluída seria terrivelmente ineficiente. Vejamos novamente o plano de atualização por índice mostrado anteriormente:
Os planos de execução são pipelines orientados por demanda: os operadores pais (à esquerda) orientam os operadores filhos a fazer o trabalho solicitando uma linha por vez deles. Os operadores Sort estão bloqueando (eles devem consumir toda a entrada antes de produzir a primeira linha classificada), mas ainda estão sendo conduzidos por seu pai (o Index Delete) solicitando a primeira linha. A exclusão do índice extrai uma linha por vez da classificação concluída, atualizando o índice não clusterizado de destino para cada linha.
Em um plano de atualização amplo, você frequentemente verá colunas sendo adicionadas ao fluxo de linha pelo operador de atualização da tabela base. Nesse caso, a exclusão de índice clusterizado adiciona colunas de chave de índice não clusterizado ao fluxo. Esses dados são exigidos pelo mecanismo de armazenamento para localizar a linha a ser removida do índice não clusterizado:
O truncamento não é permitido em uma tabela publicada usando replicação transacional ou de mesclagem. A maneira como as exclusões são replicadas depende do tipo de replicação e de como ela está configurada. Por exemplo, a replicação de instantâneo apenas replica uma exibição pontual da tabela usando métodos em massa - alterações incrementais não são rastreadas ou aplicadas. A replicação transacional funciona lendo registros de log e gerando transações apropriadas para aplicar as alterações nos assinantes. A replicação de mesclagem rastreia alterações usando gatilhos e tabelas de metadados.
Leitura relacionada: Otimizando consultas T-SQL que alteram dados
comando truncar sql
É um comando DDL (Data Definition Language), portanto comandos como COMMIT e ROLLBACK não se aplicam a este comando (as exceções aqui são PostgreSQL e MSSQL, cuja implementação do comando TRUNCATE permite que o comando seja utilizado em uma transação)
A operação de exclusão de registros não pode ser desfeita, ela ocorre automaticamente e é irreversível (salvo as exceções acima - desde que, porém, a operação esteja incluída no bloco TRANSACTION e a sessão não seja encerrada). No caso do Oracle - Inclui dois commits implícitos, um antes e outro depois que a instrução é executada. Portanto, o comando não pode ser retirado enquanto um erro de tempo de execução resultará em confirmação de qualquer maneira
Exclui todos os registros da tabela, os registros não podem ser limitados à exclusão. Para Oracle, quando a tabela é dividida por partição, as partições individuais podem ser truncadas (TRUNCATE) isoladamente, possibilitando a remoção parcial de todos os dados da tabela
Libera o espaço ocupado pelos dados na tabela (no TABLESPACE - no disco). Para Oracle - se você usar a cláusula REUSE STORAGE, os segmentos de dados não serão revertidos, ou seja, você manterá o espaço das linhas excluídas alocadas para a tabela, o que pode ser um pouco mais eficiente se a tabela for recarregada com dados . A marca alta será redefinida
Redefine o valor SEQUENCE atribuído à tabela para zero. No entanto, as seguintes opções podem ser usadas: REINICIAR IDENTIDADE ou CONTINUAR IDENTIDADE
TRUNCATE funciona muito mais rápido que DELETE
TRUNCATE gera uma quantidade insignificante de refazer e desfazer
A operação TRUNCATE torna os índices inutilizáveis utilizáveis novamente
TRUNCATE não pode ser usado quando a chave estrangeira habilitada se refere a outra tabela, então você pode:
TRUNCATE requer um bloqueio de tabela exclusivo, portanto, desativar o bloqueio de tabela exclusivo é uma forma de impedir a operação TRUNCATE na tabela
Os gatilhos DML não disparam após a execução de TRUNCATE (portanto, tenha muito cuidado neste caso, você não deve usar TRUNCATE, se um gatilho de exclusão for definido na tabela para executar uma limpeza automática da tabela ou uma ação de logon após a exclusão da linha). No Oracle, os gatilhos DDL são acionados
comando de exclusão do sql
É um comando DML (Data Manipulation Language), portanto os seguintes comandos são usados para este comando: COMMIT e ROLLBACK
Você pode desfazer a operação de remoção de registros usando o comando ROLLBACK
Exclui todos ou alguns registros da tabela, você pode limitar os registros a serem excluídos usando a cláusula WHERE
Não libera o espaço ocupado pelos dados na tabela (no TABLESPACE - no disco)
Não redefine o valor SEQUENCE atribuído à tabela
DELETE funciona muito mais devagar que TRUNCATE
DELETE gera uma pequena quantidade de refazer e uma grande quantidade de desfazer
A operação DELETE não torna os índices inutilizáveis utilizáveis novamente
DELETE caso a chave estrangeira habilitada se refira a outra tabela, pode (ou não) ser aplicado dependendo da configuração da chave estrangeira (se não), por favor:
DELETE requer um bloqueio de tabela compartilhada
Aciona o fogo
mais detalhes: https://rozwoj-oprogramowania.pl/en/blog/databases/truncate-vs-delete.html
Saudações