Update vs Merge in Oracle für eine Liste der Datensatz nicht für bulk-record gesetzt ?Leistung?
Derzeit habe ich viele update-Anweisungen in meinem Projekt ..Was ich mache, ist die übergabe einer Liste dann
looping im DataAccess-layer und die Aktualisierung der Datenbank
Lassen Sie sagen, ich habe eine Liste der Datensatz enthält Kommentar,Benutzer-id und ID ..ich bin eine Aktualisierung basierend auf ID in einer Schleife ...gibt es einen besseren Weg, es zu tun ..
Kann ich mithilfe der Merge-Anweisung ? wird es die Leistung erhöhen ?was ist der genaue Unterschied?
UPDATE RecordTable
SET
COMMENT=:COMMENT,
MODIFIEDDate = SYSTIMESTAMP,
UserID = :UserID
WHERE ID = :ID
- Es klingt, es ist nicht klar, dass Ihr problem ist das speichern der gleichen Daten an verschiedenen Orten?
- Seine arbeiten alle gut ...ich bin nur Fragen, gibt es eine bessere Möglichkeit zum aktualisieren einer Tabelle für performance-Problem ..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusammenführen wird besser sein, dann update aus dem einfachen Grund, dass die Ausführung eine Aktualisierung einer Zeile zu einer Zeit verursacht eine Menge unnötiger Kontext geschaltet und index /table access . Oracle arbeitet besser, in den Hauptteilen.
Werden, kann die Verwendung einer merge-Anweisung hier müssen Sie zum erstellen einer temporären Tabelle mit
ID
,COMMENT
undUSERID
.nur nach, führen Sie den merge -
EDIT: Aktualisierung ohne temp-Tabelle
Demo-Tabelle
Wenn Sie verwenden möchten Sammlungen in sql müssen Sie deklarieren Sie diese in der db
nun erstellen wir die Liste, und führen Sie Sie an unseren Tisch
Wie Sie sehen können, werden vorhandene Datensätze aktualisiert , Neue Datensätze eingefügt werden.
Können Sie Aktualisierungen durchführen in Masse, genauso leicht, wie Sie können, führen Sie einen Seriendruck.
Laden Sie die gewünschte update-Werte in eine Globale temporäre Tabelle und sicherstellen, dass es eine primary oder unique key constraint auf den join-Schlüssel mit der Tabelle aktualisiert werden. Führen Sie das update gegen eine Verknüpfung der beiden Tabellen, ähnlich:
Solange die inline-Darstellung ist der "key-preserved" das update wird so schnell wie ein merge.
http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10008.htm
Ebenso können Sie eine löschen, die gegen eine key-preserved Sicht oder inline anzeigen.
Als andere haben darauf hingewiesen -, Kontext-switches sind schrecklich für die Leistung. Aber Bedenken Sie, dass das Gesetz des abnehmenden Ertrags in tritt sehr schnell, wenn die Verringerung Kontext-switches. Füllstoff 10 Zeilen gleichzeitig reduziert Sie um 90%, Füllstoff 100 Zeilen reduziert Sie um 99%, etc. Um die meisten performance-Gewinn, Sie müssen nur kombinieren eine relativ kleine Anzahl von Aussagen.
Viele Umgebungen haben eine Funktion, die dies automatisch erledigt. Wie PL/SQL
forall
- oder JDBC-Batchverarbeitung. Wenn diese nicht verfügbar sind, werden Sieerreichen dies durch manuelles gruppieren von Daten-sets, die zusammen in einer größeren Erklärung. Zum Beispiel:
Für die Links-über Zeilen, verwenden Sie
null
für die ID und die Datensätze nicht überein, nichts.Wenn Ihr Frage ist nur etwa
merge
vs.update
, die die meisten erhebliche performance-Unterschied ist, dassmerge
unterstützen kann, hash-joins undupdate
nicht. Aber das spielt keine Rolle hier.