Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Update, Insert oder doch Merge? (Teil 1)

In diesem Blogbeitrag beschäftigen wir uns mit dem eher wenig bekannteren T-SQL Befehl “MERGE”, der bisher selten aktiv benutzt wird. Dabei gehört er schon seit SQL Server 2008 zum Standard.

Was macht nun der Befehl MERGE?

Laut Microsoft:

“Führt Einfüge-, Aktualisierungs- oder Löschvorgänge in einer Zieltabelle anhand der Ergebnisse eines Joins mit einer Quelltabelle aus. Sie können z. B. zwei Tabellen synchronisieren, indem Sie Zeilen in einer Tabelle anhand von Unterschieden, die in der anderen Tabelle gefunden wurden, einfügen, aktualisieren oder löschen.”

Das heißt kurz und bündig: UPDATE + INSERT = UPSERT = MERGE

Somit ist er perfekt geeignet für Ladeprozesse von Dimensionen in Data Warehouse bzw. BI Projekten. Genau dort benötigen wir ja sowohl ein INSERT als auch ein UPDATE für die Elemente der Dimensionen.

Wie wird MERGE angewendet?

Möglicherweise kommt es auf den ersten Blick ein wenig unübersichtlich vor:

MERGE
USING
ON
WHEN MATCHED THEN 
WHEN NOT MATCHED THEN ;

Wie liest man den Befehl MERGE?

Direkt nach dem MERGE folgt das “Ziel”, also die Tabelle, die wir synchronisieren wollen. Nachdem USING benutzt man die “Quelle”, die die Inhalte liefert. Z. B. die täglich zu liefernde Dimensionstabelle. Über das ON werden diese beiden verbunden (join). Für alle durch den join gefundenen Datensätze wird meist ein UPDATE ausgeführt. Dies passiert nach WHEN MATCHED THEN. Bei WHEN NOT MATCHED folgt die Aktion, wenn die Bedingung nicht erfüllt wurde. Meistens also ein INSERT.

Stellen wir uns also die Kundendimension mit zwei Attributen vor:

MERGE T_Dim_Kunde as kd
USING TMV_Import_Kunde as tmv
ON kd.KundeID = tmv.KundeID
WHEN MATCHED THEN
update set kd.KundeName = tmv.KundeName, kd.KundeVorname = tmv.KundeVorname
WHEN NOT MATCHED THEN
insert (KundeID, KundeName, KundeVorname)
values (tmv.KundeID, tmv.KundeName, tmv.KundeVorname);

Somit scheint es dann doch nicht so kompliziert zu sein. Allerdings kann dieser Befehl noch optimiert werden. Denn im Moment wird immer ein UPDATE ausgeführt, wenn “KundeID” gefunden wird. Es wäre jedoch sinnvoll diesen UPDATE nur dann zu aktivieren, wenn sich etwas an den Attributen geändert hat.
Wir brauchen sozusagen eine Zweiteilung der Bedingung, also wenn KundeID gleich ist und die Attribute ungleich sind. MERGE unterstützt dies, indem man das “WHEN MATCHED” erweitert.

MERGE T_Dim_Kunde as kd
USING TMV_Import_Kunde as tmv
ON kd.KundeID = tmv.KundeID
WHEN MATCHED
AND (kd.KundeName <> tmv.KundeName or kd.KundeVorname <> tmv.KundeVorname)
THEN
update set kd.KundeName = tmv.KundeName, kd.KundeVorname = tmv.KundeVorname
WHEN NOT MATCHED THEN
insert (KundeID, KundeName, KundeVorname)
values (tmv.KundeID, tmv. KundeName, tmv. KundeVorname);

Somit wird für eine deutliche Optimierung gesorgt. Im nächsten Blogbeitrag werden wir das Verhalten von MERGE bezüglich Historisierung von Attributen untersuchen.