Os bancos de dados fazem uma exclusão e uma inserção ao atualizar linhas?

13

Hoje, um professor nos disse que, quando o banco de dados precisa fazer uma atualização, internamente (em nível baixo), ele exclui e depois insere os campos atualizados. Ele então disse que isso é algo feito em todos os bancos de dados e, em seguida, iniciei uma discussão dizendo que achava que não fazia sentido, mas que não tinha recursos suficientes para apoiar minha posição. Ele parece saber muito, mas não consigo entender por que dbs faria isso.

Quero dizer, eu sei que se você atualizar um campo e precisar de mais espaço para essa linha, ele poderá excluir a linha fisicamente e colocá-la no final com os novos dados. Mas se, por exemplo, você reduz o espaço usado, por que o excluiria e o inseriria novamente no final?

Isso é verdade? Quais são os benefícios?

Pablo Matias Gomez
fonte
1
Ele estava falando sobre um tipo específico de banco de dados?
Tom V - try topanswers.xyz
1
@TomV ele estava falando sobre o SQL Server, mas ele então disse que foi feito assim em todos os dbs ..
Pablo Matias Gomez

Respostas:

16

Isso é verdade?

Não, é um detalhe de implementação. Um banco de dados pode implementar uma atualização adequada no lugar se ele assim o desejar.

Quais são os benefícios?

Dividir uma atualização em uma exclusão seguida por uma inserção geralmente torna a implementação mais simples. Os benefícios colaterais potenciais incluem a capacidade de evitar violações transitórias de chave em um índice exclusivo, classificando adequadamente as operações de exclusão / inserção de divisão.

Uma atualização dividida pode ser um pouco mais lenta e gerar mais log do que uma atualização verdadeira no local (o que nem sempre é possível).

Como Kin observou em um comentário, se você precisar de um exemplo (para SQL Server), consulte:

Também está relacionado à implementação do MVCC. Na página da Wikipedia sobre MVCC , é mencionado:

Quando um banco de dados MVCC precisa atualizar um item de dados, ele não substitui os dados antigos por novos , mas marca os dados antigos como obsoletos e adiciona a versão mais recente em outro local. Portanto, existem várias versões armazenadas, mas apenas uma é a mais recente. Isso permite que os leitores acessem os dados que estavam lá quando começaram a ler, mesmo que tenham sido modificados ou excluídos parcialmente por outra pessoa.

Veja também a página 60 do pdf do PostgreSQL Internals por Bruce Momjian (o Postgres usa MVCC): " UPDATEé efetivamente um DELETEe um INSERT".

Paul White 9
fonte