Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was sind die Vorteile von MERGE gegenüber einfachem IF EXISTS?

MERGE kombiniert die INSERT-, UPDATE- und DELETE-Logik in einer DML-Anweisung und ist daher atomar. Bei einreihigen UPSERTS sind die Vorteile weniger offensichtlich. Beispielsweise kann eine naive Implementierung eines UPSERT wie folgt aussehen:

IF  EXISTS (SELECT * FROM t1 where [email protected])
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)

Ohne dies jedoch in eine Transaktion einzubinden, ist es möglich, dass die Zeile, die wir aktualisieren werden, zwischen dem SELECT und dem UPDATE gelöscht wird. Das Hinzufügen einer minimalen Logik, um dieses Problem zu beheben, ergibt Folgendes:

BEGIN TRAN
IF  EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)
COMMIT

Diese Logik ist bei der MERGE-Anweisung nicht erforderlich.

Es gibt keine Vergleiche, die zwischen CURSORS und der MERGE-Anweisung gezogen werden sollten.