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

tsql - Batch-Einfügungsleistung

Obwohl es den Anschein hat, dass weniger zu verarbeitender Code Ihnen einen Leistungsgewinn bringen sollte, ist die Verwendung der ersten Option (union all) eine schlechte Idee. Alle select-Anweisungen müssen analysiert und ausgeführt werden, bevor die Daten in eine Tabelle eingefügt werden. Es verbraucht viel Speicher und kann selbst bei relativ kleinen Datenmengen ewig dauern, bis es fertig ist. Andererseits werden separate Insert-Anweisungen "on the fly" ausgeführt.

Führen Sie einen einfachen Test in SSMS durch, der dies beweist:Erstellen Sie eine einfache Tabelle mit 4 Feldern und versuchen Sie, 20.000 Zeilen einzufügen. Die zweite Lösung wird in Sekunden ausgeführt, während die erste ... Sie werden sehen :).

Ein weiteres Problem besteht darin, dass Sie, wenn die Daten in einer Zeile nicht korrekt sind (z. B. Typkonflikt), einen Fehler wie Conversion failed when converting the varchar value 'x' to data type int. erhalten , aber Sie haben keinen Hinweis darauf, welche Zeile fehlgeschlagen ist - Sie müssten sie selbst finden. Aber mit separaten Einfügungen wissen Sie genau, welche Einfügung fehlgeschlagen ist.