2010-08-09 7 views
5

Supposons que j'ai une table et un index sur elleComment une table UPDATE est-elle gérée par un SGBDR?

original simple table A 
------------------------ 
rowid | id name 
123 | 1 A 
124 | 4 G 
125 | 2 R 
126 | 3 P 

index on A.id 
------------- 
id rowid 
1 123 
2 125 
3 126 
4 124 

À ce stade, j'exécuter cette instruction DML

UPDATE A SET id = 5 WHERE id = 4 

Que se passe exactement quand cette instruction est exécutée?

a)

BEGIN 
go to index 
search for `id == 4` (B tree index generally) 
find that `rowid = 124` 
go to that location 
update id in the table 
come back (? I am not sure) 
update the index 
END 

b)

BEGIN 
go to index 
search for `id == 4` (B tree index generally) 
update the id value in index 
find that `rowid = 124` 
go to that location 
update id in the table 
END 

c) Quelque chose d'autre se passe entièrement

Comme cela pourrait dépendre de la base de données elle-même, comment cela arrive dans Oracle?

+1

Je suppose que les implémentations varient et beaucoup d'entre elles seront par défaut c) plutôt que d'être simplement fendue en a) ou b) ... – meagar

+0

Est-ce que ce travail est fait? –

+0

@Henk: Non. J'essaie juste de comprendre comment cela fonctionne. C'est un scénario que j'ai inventé. – Moeb

Répondre

1

De: http://jonathanlewis.wordpress.com/2006/11/22/tuning-updates/

"Si Oracle utilise un index (B-tree) pour trouver les données à mettre à jour, il reporte les mises à jour d'index (B-tree) nécessaires jusqu'à la fin de la mise à jour, puis trie les clés d'index (avec leur rowids) pour l'avant et après valeurs avant d'appliquer les mises à jour en vrac à les indices »

Si vous avez fait une trace détaillée, les événements d'attente montrent les détails fichier/bloc pour IO. À partir de là, il devrait être possible de déterminer l'objet (en utilisant DBA_EXTENTS) et donc l'ordre dans lequel les choses sont accédées. Cela dit, il est assez académique et ne devrait pas affecter la façon dont vous codez les choses.

0

Pour voir le plan d'exécution pour votre déclaration de mise à jour particulière:

  1. activer le suivi pour votre session
  2. Exécutez votre PL/SQL
  3. run tkprof sur le fichier de trace
Questions connexes