2010-11-27 5 views
11

Il s'agit d'une question SQL Server mais j'apprécierais les réponses d'autres contextes SGBD correctement identifiés.Est-ce que UPDATE = DELETE (marqué comme) + INSERT?

La réponse par Seth Lynch à ma question dans le forum MSDN:

dit:

« Lorsque les données sont mis à jour, il est pas trop écrit - l'original la ligne est marquée comme supprimée et une nouvelle ligne est insérée "

Est-ce une déclaration correcte? Pouvez-vous donner des références supportant cela dans docs?
Comment peut-on le vérifier?

discussions connexes:

Mise à jour: Pas longtemps je croyais il y a que les lectures autorisées à READ niveau d'isolation des transactions non validés (ou, ce qui est la même dans SQL Server, par WITH (NOLOCK) hint) permet de lire (à partir d'autres transactions) des valeurs non validées (ou validées, si pas encore modifiées) mais non partiellement modifiées (partiellement mises à jour, partiellement supprimées ou partiellement insérées).REPRENDRE ': mettre court, cette phrase est généralement et pour la plupart des cas incorrect (alors qu'il déclare cas catégoriquement au sujet plutôt hors du commun dans SQL Server)

+0

Cela mettrait à jour les champs AUTO_INCREMENT? –

Répondre

9

Selon Kalen Delaney, dans son livre Inside Microsoft SQL Server 2005: Le moteur de stockage, SQL Server 2005 (et maintenant 2008) peut mettre à jour une ligne en utilisant une insertion/suppression ou en place, en modifiant simplement la valeur d'une colonne. Voici un bref résumé de ce qu'elle dit à la p. 306-311 du livre.

Le comportement normal dans SQL Server 2005/2008 consiste à mettre à jour une ligne sur place. La ligne reste au même emplacement sur la page et seuls les octets affectés sont modifiés. Un exemple de ceci serait mettre à jour la valeur dans une colonne entière qui ne fait pas partie de l'index culstered.

Une ligne peut être mise à jour avec une insertion/suppression lorsque sa taille change et qu'elle ne tient plus sur la page d'origine. Cela peut se produire lorsque vous modifiez la valeur dans une colonne varchar et la prolongez. Cela se produit également lorsque la colonne d'index clusterisée change et que la ligne doit se déplacer en raison de sa position dans l'index (car les lignes sont classées par la clé en cluster). Un exemple de cela serait de changer le nom de famille de quelqu'un de "Smith" en "Jones" dans une table avec un index en cluster sur le nom de famille.

2

Cela dépend de l'implémentation.

En général, lorsque le contrôle de la concurrence multiversion (MVCC) est utilisé, la ligne d'origine est conservée. Il est marqué comme supprimé par la transaction qui l'a supprimé et une ligne de remplacement est créée, ou un delta est stocké ailleurs dans le contexte de transaction, jusqu'à ce que la transaction soit validée et que le delta soit appliqué à la ligne existante.

Dans le contrôle de concurrence basé sur les verrous, la ligne peut être modifiée in situ car une seule transaction peut lire et écrire la ligne.

Les détails dépendent de l'implémentation. Certains systèmes utiliseront un delta jusqu'à commit, et d'autres changeront la ligne mais garderont une copie de l'original à utiliser en cas de rollback.

+0

Quelle est votre référence? Dans sa discussion sur les mises à jour en place (p.309), Delaney écrit: "De plus, le journal contiendra un seul enregistrement pour chaque ligne mise à jour, sauf si la table a un déclencheur de mise à jour ou est marqué pour la réplication. la mise à jour se produit toujours sur place, mais le journal contiendra un enregistrement de suppression suivi d'un enregistrement d'insertion. " – DataWriter

+0

Parlez-vous d'Oracle, Fredt? – DataWriter

+0

Références "Database Management Systems" troisième édition, Ramakrishnan, Gehrke et "Une introduction aux systèmes de base de données" huitième édition, C.J. Date. Je crains de ne pas avoir de référence de page, et comme je l'ai dit, cela dépend de la mise en œuvre et il peut y avoir d'autres implémentations. – fredt

1

Dans Oracle, un UPDATE modifie toujours la ligne d'origine. Les anciennes valeurs de la ligne sont écrites dans le journal UNDO et y restent pendant un certain temps dans le cadre de l'implémentation du contrôle de concurrence multiversion (MVCC).

Tant que les nouvelles valeurs ne sont pas validées, toutes les autres transactions recevront les anciennes valeurs du journal UNDO. La même chose se produit si votre requête a démarré avant la COMMIT des nouvelles valeurs ou avec certains modes d'isolation de transaction. Si les nouvelles valeurs sont plus grandes et que la ligne ne rentre plus dans la même page, la ligne est migrée vers une nouvelle page et l'espace sur l'ancienne page est libéré.

+0

"Dans Oracle, un UPDATE modifie toujours la ligne d'origine" même si les colonnes clés d'un index clusterisé sont UPDATEd? –

+0

Votre droit. C'est l'exception à la règle. – Codo

Questions connexes