DELETE vs TRUNCATE

35

Estou tentando entender melhor as diferenças entre os comandos DELETEe 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):

  1. Como os diferentes modos de recuperação afetam cada instrução? Se houver algum efeito
  2. 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?)
  3. Como os comandos são replicados? O comando SQL é enviado e processado em cada assinante? Ou o MSSQL é um pouco mais inteligente que isso?
Stuart Blackler
fonte
2
Há algumas informações relacionadas DELETEe TRUNCATEnas respostas a esta pergunta sobre a utilidade de TRUNCATE-ing imediatamente antes de a DROP. Você também pode procurar no log você mesmo para estudar os efeitos de ambos os comandos usando a técnica descrita nesta resposta .
Nick Chammas
11
Esta resposta mostra os internos das operações DELETE e TRUNCATE. Além disso, a pergunta demonstra uma situação específica em que o TRUNCATE funciona melhor.
孔夫子
5
@idstam TRUNCATEpode ser revertido. Nick cobre isso em sua resposta à pergunta que ele vinculou .
Mark-Storey-Smith
Truncar requer permissão "alterar tabela" (no sentido em que truncar é um plug-in que substitui a exclusão).
crokusek 29/09/16

Respostas:

58

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.

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):

Exclusão 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.

Exclusão por índice

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.

Sim. TRUNCATE TABLEé mais eficiente por vários motivos:

  1. Menos bloqueios podem ser necessários. O truncamento normalmente requer apenas um bloqueio de modificação de esquema único no nível da tabela (e bloqueios exclusivos em cada extensão desalocada). A exclusão pode adquirir bloqueios com granularidade mais baixa (linha ou página), bem como bloqueios exclusivos em qualquer página desalocada.
  2. Somente o truncamento garante que todas as páginas sejam desalocadas de uma tabela de heap. A exclusão pode deixar páginas vazias em um heap, mesmo que uma dica exclusiva de bloqueio de tabela seja especificada (por exemplo, se um nível de isolamento de versão de linha estiver ativado para o banco de dados).
  3. O truncamento é sempre minimamente registrado (independentemente do modelo de recuperação em uso). Somente operações de desalocação de página são registradas no log de transações.
  4. O truncamento pode usar queda adiada se o objeto tiver 128 extensões ou maior de tamanho. Eliminação adiada significa que o trabalho real de desalocação é executado de forma assíncrona por um encadeamento do servidor em segundo plano.

Como os diferentes modos de recuperação afetam cada instrução? Existe algum efeito?

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.

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?)

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:

Plano amplo 2

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:

Detalhes da lista de saída

Como os comandos são replicados? O comando SQL é enviado e processado em cada assinante? Ou o SQL Server é um pouco mais inteligente que isso?

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

Paul White diz que a GoFundMonica
fonte