Les bases de données effectuent-elles une suppression et une insertion lors de la mise à jour des lignes?

13

Donc, aujourd'hui, un professeur nous a dit que lorsque la base de données doit faire une mise à jour, en interne (à bas niveau), elle fait une suppression puis une insertion avec les champs mis à jour. Il a ensuite dit que c'était quelque chose de fait dans toutes les bases de données, puis j'ai commencé une discussion disant que je pensais que cela n'avait aucun sens mais que je n'avais pas suffisamment de ressources pour soutenir ma position. Il semble en savoir beaucoup mais je ne comprends pas pourquoi dbs ferait ça.

Je veux dire, je sais que si vous mettez à jour un champ et que vous avez besoin de plus d'espace pour cette ligne, cela peut supprimer la ligne physiquement et la mettre à la fin avec les nouvelles données. Mais si par exemple vous réduisez l'espace utilisé, pourquoi le supprimerait-il et le réinsérerait-il à la fin?

Est-ce même vrai? Quels sont les bénéfices?

Pablo Matias Gomez
la source
1
Parlait-il d'un type spécifique de base de données?
Tom V - essayez topanswers.xyz
1
@TomV il parlait du serveur sql mais il a ensuite dit que c'était fait comme ça dans tous les dbs ..
Pablo Matias Gomez

Réponses:

16

Est-ce même vrai?

Non, c'est un détail d'implémentation. Une base de données peut implémenter une mise à jour appropriée en place si elle le souhaite.

Quels sont les bénéfices?

La division d'une mise à jour en une suppression suivie d'une insertion simplifie généralement la mise en œuvre. Les avantages secondaires potentiels incluent la possibilité d' éviter les violations de clés transitoires dans un index unique, en triant correctement les opérations de suppression / insertion fractionnées.

Une mise à jour fractionnée peut être un peu plus lente et générer plus de journaux qu'une véritable mise à jour sur place (ce qui n'est pas toujours possible de toute façon).

Comme Kin l'a noté dans un commentaire, si vous avez besoin d'un exemple (pour SQL Server), voir:

Il est également lié à la mise en œuvre de MVCC. Dans la page Wikipedia sur MVCC , il est mentionné:

Lorsqu'une base de données MVCC doit mettre à jour un élément de données, elle n'écrasera pas les anciennes données par de nouvelles données , mais marquera plutôt les anciennes données comme obsolètes et ajoutera la nouvelle version ailleurs. Ainsi, plusieurs versions sont stockées, mais une seule est la dernière. Cela permet aux lecteurs d'accéder aux données qui étaient là lorsqu'ils ont commencé à lire, même si elles ont été modifiées ou supprimées en cours de route par quelqu'un d'autre.

Voir aussi page 60 de PostgreSQL Internals pdf de Bruce Momjian (Postgres utilise MVCC): " UPDATEis effective a DELETEand an INSERT."

Paul White 9
la source