Einfügen 1000 Zeilen an SQL-Tabelle mit SSMS
Habe ich ein sql Skript mit den insert-Anweisungen zum einfügen von 1000 Zeilen (12000 ca.).
Wenn ich versuche das Skript ausführen, die in SSMS, wirft er 'Out of memory' exception nach einer Weile.
"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown."
Habe ich SQL Server 2008 auf Vista mit 3gb RAM.
Irgendwelche Gedanken oder Hinweise wären sehr willkommen!
- könnten Sie die post-script, zumindest die vereinfachte version?
- ist es Express oder standard/dev?
- Yep, mehrmals gesehen. Siehe meine Antwort unten, wie ich es behoben haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine alte post, aber niemand scheint erkannt zu haben, das offensichtliche Problem. Also ich wollte nach einer Antwort, kann jemand helfen auf der Suche nach Antworten. Unter SQL Server\Properties\Memory gibt es eine Einstellung für Minimum Memory Per Query. Sie können erhöhen Sie diese Zahl vorübergehend zu helfen, erhöhen Sie die Anzahl der Datensätze zwischen den GO-Anweisungen. In meinem Fall habe ich angehoben, dies zu 5000 (10000 verursacht ein system out-of-memory-Fehler, nicht gut) also entschied ich mich für 5000, nach ein paar tests, die ich fand, ich könnte jetzt importieren Sie über 20.000 Zeilen, so dass ich legte ein GO-Anweisung alle 20.000 Zeilen hat (etwa 10 Minuten) und ich war in der Lage zu importieren, die mehr als 200.000 Zeilen in einer Abfrage.
Happy coding, Rob
Haben Sie an der Aufteilung der Befehle. Die einfachste Möglichkeit ist das hinzufügen von ein GEHEN Sie alle 10 Zeilen oder so.
Grundsätzlich das SSMS zu laden versucht, alle Ihre text in eine single SqlCommand.CommandText-und ausführen. Das wird nicht funktionieren.
Sie brauchen, um es zu batch Sie. GO ist eine einfache split-Punkt in SSMS, wo es bis zu diesem Punkt und führen Sie es, dann weiter.
LINE1
2
...
GEHEN
LINE11
LINE12
Ausgeführt werden in 2 SqlCommands der Datenbank.
Wenn Sie brauchen Sie alle laufen in einer einzigen Transaktion werden Sie wahrscheinlich haben, um schreiben Sie eine Befehl Linie app laden jede Zeile und führen Sie es innerhalb einer Transaktion. Ich glaube nicht, können Sie split-Transaktionen über Hinrichtungen in SSMS.
Sie können auch bauen Sie ein SSIS-Paket, das ist aber eine MENGE Arbeit und ich weiß nicht empfehlen, es sei denn, Sie müssen wiederholen Sie diesen Vorgang ein jeder so oft.
System.OutOfMemoryException ist eine CLR-Ausnahme, nicht um eine SQL Server-Ausnahme. SQL würde ein Fehler ausgelöst, 701, und außerdem wäre es nicht der Arbeitsspeicher einfach ausführen einige insrts, um mit zu beginnen.
Die Tatsache, dass Sie eine CLR-Ausnahme zeigt an, dass das problem vielleicht in SSMS selbst. Stellen Sie sicher, dass Ihr Skript nicht zurück, vermeidbare Ergebnis-sets und Nachrichten zu SSMS. Versuchen Sie auch, das Skript von sqlcmd.
Müssen Sie möglicherweise zum einlegen der ungeraden
commit
so füllen nicht die Transaktionsprotokolle.Dem Update stellte sich heraus ausgeführt werden, werden die insert-Anweisungen in batches. Ich musste ein wenig Experimentieren, um die zu identifizieren, die maximale Anzahl der Einsätze, die ich tun könnte in einer Transaktion.
So, das Update, die für mich gearbeitet wurde die Spaltung des insert-Anweisungen in kleinere Gruppen (5000) und markieren Sie diese als Transaktion mit commit. Wiederholt den gleichen Vorgang für alle Gruppen. Es funktionierte ohne "out of memory" exception.
Aber auf der dunkleren Seite, es hat mich 2 Stunden zum einfügen der 50.000 Zeilen, das hat mich selbst überrascht. War es ein Weg, ich hätte es auch in kürzerer Zeit?
Schätze Ihre Kommentare. Speziell paxdiablo und Jason Kurz für den Hinweis auf die Lösung und alle anderen für die Begründung, die Ursache.
Stellen Sie sicher, dass Sie die Verwendung von SET NOCOUNT ON;
Statt:
Könnte man alternativ versuchen Sie, ein Gebäude das Skript mit der folgenden, die arbeitet als eine einzige implizite Transaktion (Vermeidung der Notwendigkeit, ausführen, BEGEHEN, zwischen jedem einfügen):
Jedoch, wenn das gesamte Skript ist immer noch zu groß für SSMS zu behandeln (ich kann mir vorstellen, die Sie einfügen einige längere strings), dann Ihre Optionen sind wie die anderen vorgeschlagen haben ... split up Ihr Skript oder verwenden Sie ein anderes tool.
War ich einfügen, mit dem cursor durch den Aufruf der gespeicherten Prozedur drin
aber wurde nicht für die out-of-memory-Ausnahme
Legte ich gehen an der letzten Gespeicherten Prozedur es erhöht etwas die Leistung
Zuletzt geändert grid-Ansicht zu Text anzeigen in management studio, Es hat gut funktioniert.
Öffnen > Task-Manager > in der Nähe SSMS Service
Dann wieder öffnen SSMS studio
Jetzt können Sie Ihre Abfrage ausgeführt.