ich möchte in eine Tabelle regelmäßig per Perl-Skript Daten schreiben die ich per CSV Datei erhalte (ca 50.000 Datensätze pro Tag). Bei den Daten kann es vorkommen, dass sie der Primär Schlüssel schon in der tabelle vorhanden ist.
Falls ein schon vorhandener Primär Schlüssel auftaucht, sollte ein Update gemacht werden, falls es den Primär Schlüssel noch nicht gibt ein Insert.
Gibt es eine elegantere/schnellere Lösung, als vor jedem Datensatz mit einem Select nachzusehen, ob der Datensatz schon existiert?
Es sollte möglichst schnell ablaufen.
Ich könnte natürlich auch erst ein Delete über alle Datensätze machen, deren Primär Schlüssel in der CSV Datei vorkommt. Dann die Inserts und zum Schluß das commit.
Wie schon gesagt mit MERGE, oder Du versucht ganz einfach mal ein UPDATE und wenn SQL%ROWS (keine Schläge bitte, ich weiß den Namen nimmer auswendig, aber irgendwie so ähnlich) 0 (Anzahl der upgedateten Records) zurückliefert machst Du ein INSERT …
du hast ja schon mehrere Vorschläge bekommen. Einen hätte ich auch noch:
BEGIN
INSERT ...
EXCEPTION WHEN DUP\_VAL\_ON\_INDEX THEN
UPDATE ...
END;
/
COMMIT;
Ist abgesehen von MERGE vermutlich das schnellste, weil nur die unbedingt notwendigen Operationen ausgeführt werden. Wenn’s dir um Performance geht würde ich übrigens zumindest alle non-unique Indices ausschalten und danach wieder einschalten. Den Primary Key musst du bei der obigen Variante natürlich laufen lassen, sonst kommst du a) nie in die Exception und hättest b) einen recht langsamen Update (full table scan) wenn du hinkämst…