Schon gewusst ...? Multi Table Insert
Normalerweise macht man ein SQL INSERT in genau eine Tabelle - die Syntax ist ja auch
INSERT INTO {TABLE}. Wusstet Ihr, dass man mit einem SQL INSERT jedoch auch in meherer
Tabellen gleichzeitig einfügen kann. Und ich meine nun nicht das SQL INSERT in eine
VIEW und das Verteilen per INSTEAD-OF Trigger (hierzu gab es schonmal ein Blog Posting.
Nein, ich meine den sog. Multi-Table-Insert. Dazu ein Beispiel. Zuerst erstellen
wir die Zieltabellen, die zugegebenermaßen recht einfach gestrickt sind, aber für ein einfaches
Beispiel sollte das reichen ...
Und dann probieren wir unseren ersten Multi Table Insert.
Man sieht, dass danach beide Tabellen gefüllt sind - mit einem einzigen INSERT-Kommando. Doch
das ist noch nicht alles. Wie man den Tabellennamen schon ansehen kann, möchten wir bestimmte
Zeilen in bestimmte Tabellen haben ... und auch das geht mit dem Multi-Table-Insert.
Und auch das funktioniert - abhängig von der DEPTNO gehen die Zeilen in unterschiedliche
Tabellen. Das kann noch mit einer ELSE-Anweisung kombiniert werden ...
Bislang wurden stets alle WHEN-Klauseln beachtet - die Klauseln selbst schließen
sich ja schon gegenseitig aus. Anders sieht es hier aus ...
KING gehört zur DEPTNO 10 und hat ein SAL größer als 3000. Er landet also
sowohl in der Tabelle EMP_HIGHSAL, als auch in EMP10.
Unter Umständen sollen diejenigen Zeilen, die in EMP_HIGHSAL eingefügt wurden,
nicht mehr weiter verarbeitet werden - es soll also nach der ersten passenden
WHEN-Klausel aufgehört werden. Auch das geht - statt INSERT ALL schreiben wir dann
INSERT FIRST.
Die Tatsache, dass viele INSERTs in einem Kommando abgearbeitet werden,
kann die Performance bei großen Datenmengen extrem beeinflussen - denn die
Quelldaten werden beim Multi-Table-Insert nur einmal durchgearbeitet - würde man
einzelne INSERT-Anweisungen machen, würden die Daten für jedes INSERT einmal
durchgescannt. Mehr Info in der Dokumentation: http://download.oracle.com/docs/cd/E11882_01/server.112/e16579/transform.htm#i1006530.
Kommentare:
Cooles feature! Wird leider noch viel zu selten eingesetzt.
Sehr schöner Tip! War mir wirklich vollkommen neu, dass es das gibt.
Vielen Dank dafür
Kommentar veröffentlichen