Estou tentando entender melhor as diferenças entre os comandos DELETE
e TRUNCATE
. Minha compreensão dos internos é algo parecido com:
DELETE
-> o mecanismo de banco de dados localiza e remove a linha das páginas de dados relevantes e de todas as páginas de índice em que a linha é inserida. Assim, quanto mais índices, mais tempo a exclusão leva.
TRUNCATE
-> simplesmente remove todas as páginas de dados da tabela em massa, tornando-a uma opção mais eficiente para excluir o conteúdo de uma tabela.
Assumindo que o acima está correto (corrija-me se não estiver):
- Como os diferentes modos de recuperação afetam cada instrução? Se houver algum efeito
- Ao excluir, todos os índices são verificados ou apenas aqueles em que a linha está? Eu assumiria 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 que isso?
sql-server
database-internals
Stuart Blackler
fonte
fonte
DELETE
eTRUNCATE
nas respostas a esta pergunta sobre a utilidade deTRUNCATE
-ing imediatamente antes de aDROP
. Você também pode procurar no log você mesmo para estudar os efeitos de ambos os comandos usando a técnica descrita nesta resposta .TRUNCATE
pode ser revertido. Nick cobre isso em sua resposta à pergunta que ele vinculou .Respostas:
Sim, embora haja duas opções aqui. As linhas podem ser excluídas dos índices não clusterizados linha a linha pelo mesmo operador que executa as exclusões da tabela base. Isso é conhecido como plano de atualização restrito (ou por linha):
Ou, as exclusões de índice não clusterizadas 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 mesa de trabalho (spool ansioso) antes de ser reproduzido uma vez por índice, geralmente classificado explicitamente pelas chaves do índice não clusterizado para incentivar uma sequência padrão de acesso.
Sim.
TRUNCATE TABLE
é mais eficiente por vários motivos:A exclusão é sempre totalmente registrada (todas as linhas excluídas são registradas 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
FULL
, mas ainda é log tecnicamente completo.A exclusão de uma linha em um índice (usando os planos de atualização restritos ou amplos 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 pai (à esquerda) levam os operadores filhos a trabalhar solicitando uma linha de cada vez. Os operadores de classificação estão bloqueando (eles devem consumir toda a entrada antes de produzir a primeira linha classificada), mas ainda estão sendo controlados pelo pai (a exclusão do índice) solicitando a primeira linha. A exclusão do índice extrai uma linha de cada vez da classificação concluída, atualizando o índice não clusterizado de destino para cada linha.
Em um amplo plano de atualização, você verá frequentemente colunas sendo adicionadas ao fluxo de linhas pelo operador de atualização da tabela base. Nesse caso, a exclusão de índice clusterizado adiciona colunas de chave de índice não clusterizadas ao fluxo. Esses dados são necessários 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. Como as exclusões são replicadas depende do tipo de replicação e de como está configurada. Por exemplo, a replicação de instantâneo apenas replica uma visualização point-in-time da tabela usando métodos em massa - alterações incrementais não são rastreadas ou aplicadas. A replicação transacional funciona lendo os registros de log e gerando transações apropriadas para aplicar as alterações nos assinantes. A replicação de mesclagem rastreia alterações usando acionadores e tabelas de metadados.
Leitura relacionada: Otimizando consultas T-SQL que alteram dados
fonte