SQL server MERGE Slow

Ich importiere data in SQL server mit der MERGE-function, und es ist extrem langsam. Ich bin sicher, das ist, weil ich nicht die Dinge am besten mache, aber ich bin mir nicht sicher, was der beste path ist.

Um zu erklären, ich verwende Java, ich stelle ein BatchUpdate mit Paketen von 5k MERGE Aussagen (ich habe verschiedene Batchgrößen ausprobiert). Der Zusammenschluss nutzt die Parameter, wobei die Werte auf dem BatchUpdate zB eingestellt sind:

MERGE [MY_DATABASE_TABLE] AS TARGET USING (SELECT ?, ?, ?, ?, ?, ?, ?, ?) AS SOURCE 

Das ? Parameter werden durch die tatsächlichen Werte ersetzt, wenn ich das BatchUpdate ausführe. Meine MERGE-statement hat eine Anzahl von folgenden bedingten Prüfungen, wenn sie abgestimmt sind (wenn die Quelle null ist und das Ziel nicht null ist)

Um einen Hinweis auf die performance zu geben, für 38k Zeilen mit einer geraden INSERT-statement, ist die time 8 Sekunden, mit einem MERGE ist es 3 Minuten. Diese time scheint sich exponentiell zu erhöhen, wenn die Anzahl der Zeilen zunimmt (90k Zeilen = 23 Minuten). Die gleiche functionalität in MYSql ist 10 Sekunden (MySQL verwendet bei doppelter Key Update). Da SQL server dann meine databasetabelle für die Dauer der MERGE (23mins!) Und meine 90k Zeilen sperrt, ist eine relativ kleine Testdatei, diese Performance ist äußerst unerwünscht.

Dies muss etwas sein, das ich nicht optimiert habe. Meine "MERGE On" -Spalten in meiner Target-databasetabelle sind alle indiziert (UNIQUE KEY), also ist es nicht so. Ich kann meine Quelle nicht indizieren, da meine Quelle keine databasetabelle ist. Das macht mich frage mich, ob ich zuerst alle data in einen temporären Tisch importieren und dann daraus merge soll?

Meine Frage ist: Sollte der MERGE wie ich es erwartet habe, schneller zu sein, oder ist MERGE nur schnell, wenn er mit temporären Tabellen verwendet wird, die indiziert sind?


Anmerkung: Ich verwende den sqljdbc4 v 4.0.x Treiber

Hinweis: batchUpdate wird von org.springframework.jdbc.core.JdbcTemplate zur Verfügung gestellt

Anstelle von MySQL – SQL server kann MERGE nicht doppelte Schlüssel ignorieren. Und selbst wenn IGNORE_DUP_KEY für einen eindeutigen Index auf der IGNORE_DUP_KEY auf ON IGNORE_DUP_KEY ist, ignoriert MERGE diese Einstellung.

Ja MERGE ist schneller mit indizierter temporärer Tabelle.