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?
la source
Réponses:
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.
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é:
Voir aussi page 60 de PostgreSQL Internals pdf de Bruce Momjian (Postgres utilise MVCC): "
UPDATE
is effective aDELETE
and anINSERT
."la source