Oracle: Multi-Table-INSERT
15.09.2009 17:13
Performantes Einfügen
Häufig besteht die Anforderung, Einfügeoperationen in mehrere Zieltabellen durchzuführen. Falls die Quellinformationen aus einer großen Tabelle stammen, ist diese in jedem Fall zuerst vollständig zu lesen. Die offensichtliche Lösung, mehrere INSERT-Statements zu verwenden, führt dazu, dass diese Quelltabelle mehrfach zu lesen ist und somit unnötige Datenbankressourcen verschwendet werden. Die Verwendung von Multi-Table-INSERT ist hier die optimale Lösung. Mit einem einzigen INSERT-Statement lassen sich gleichzeitig mehrere Tabellen füllen oder auch abgeleitete Informationen einfügen.
INSERT ALL INTO product_activity VALUES (today, product_id, quantity) INTO product_sales VALUES (today, product_id, total) SELECT order_date today, product_id, SUM(unit_price) total, SUM(quantity) quantity FROM orders, order_items WHERE orders.order_id = order_items.order_id AND order_date = SYSDATE GROUP BY product_id;
Wird die Operation zusätzlich parallelisiert durchgeführt, ist in der Regel eine weitere Performancesteigerung erreichbar. Im vorangehenden Beispiel wurde keine Bedingung angegeben. Es wurde also ein sogenanntes unconditional INSERT-Statement verwendet. Wie Sie zusätzlich Bedingungen nutzen, zeigt das folgende Beispiel:
INSERT ALL WHEN product_id IN (SELECT product_id FROM promotional_items) THEN INTO promotional_sales VALUES(product_id,list_price) WHEN order_mode = 'online' THEN INTO web_orders VALUES(product_id, order_total) SELECT product_id, list_price, order_total, order_mode FROM orders;
(Ulrike Schwinn/Heinz-Wilhelm Fabry/am)
