5 Stimmen

Wie wird ein UPDATE einer Tabelle in einem RDBMS gehandhabt?

Angenommen, ich habe eine Tabelle und einen Index für sie

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

An diesem Punkt führe ich diese DML-Anweisung aus

UPDATE A SET id = 5 WHERE id = 4

Was genau passiert, wenn diese Anweisung ausgeführt wird?

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) Es passiert etwas ganz anderes

Da dies von der Datenbank selbst abhängen kann, Wie läuft das in Oracle ab?

1 Stimmen

Ich vermute, dass es unterschiedliche Implementierungen gibt und viele von ihnen eher zu c) als zu a) oder b) passen...

0 Stimmen

@Henk: Nein. Ich versuche nur zu verstehen, wie das funktioniert. Das ist ein Szenario, das ich mir ausgedacht habe.

0 Stimmen

Also gut. Es sah nur ein wenig künstlich aus.

1voto

Gary Myers Punkte 34373

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

"Wenn Oracle einen (B-Baum-)Index verwendet, um die zu aktualisierenden Daten zu finden, wird verschiebt es alle (B-Baum)-Index-Aktualisierungen bis zum Ende der Aktualisierung, sortiert dann die Indexschlüssel (mit ihren rowids) für die Vorher- und Nachher Werte, bevor er Massenaktualisierungen auf die Indizes"

Wenn Sie eine detaillierte Verfolgung durchgeführt haben, zeigen die Warteereignisse die Datei-/Blockdetails für IO. Von dort aus sollte es möglich sein, das Objekt (mit DBA_EXTENTS) und damit die Reihenfolge der Zugriffe zu bestimmen.

Allerdings ist dies eher akademischer Natur und sollte keinen Einfluss auf Ihren Code haben.

0voto

dave Punkte 1294

So sehen Sie den Ausführungsplan für Ihre spezielle Aktualisierungsanweisung:

  1. Aktivieren Sie die Ablaufverfolgung für Ihre Sitzung
  2. Führen Sie Ihr PL/SQL aus
  3. tkprof auf die Trace-Datei anwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X