Ich schlage vor, Daten in Blöcken zu lesen:
Anstatt die gesamte Tabelle zu laden, versuchen Sie, die Daten in Blöcke aufzuteilen und sie in SQL Server zu importieren. Vor einiger Zeit habe ich eine ähnliche Antwort zu SQLite beantwortet, ich werde versuchen, sie so zu reproduzieren, dass sie der Oracle-Syntax entspricht:
Schritt-für-Schritt-Anleitung
In diesem Beispiel enthält jeder Chunk 10000 Zeilen.
- Deklarieren Sie 2 Variablen vom Typ
Int32
(@[User::RowCount]
und@[User::IncrementValue]
) - Fügen Sie eine
Execute SQL Task
hinzu die einenselect Count(*)
ausführen Befehl und speichern Sie die Ergebnismenge in der Variablen@[User::RowCount]
- Fügen Sie eine For-Schleife mit den folgenden Einstellungen hinzu:
- Fügen Sie innerhalb des for-Schleifen-Containers eine
Data flow task
hinzu - Fügen Sie innerhalb der Datenflussaufgabe eine
ODBC Source
hinzu undOLEDB Destination
- Wählen Sie in der ODBC-Quelle
SQL Command
aus Option und schreiben Sie einSELECT * FROM TABLE
query *(um nur Metadaten abzurufen` - Ordnen Sie die Spalten zwischen Quelle und Ziel zu
- Gehen Sie zurück zum
Control flow
und klicken Sie auf dieData flow task
und drücken Sie F4 um das Eigenschaftsfenster anzuzeigen -
Gehen Sie im Eigenschaftenfenster zu Ausdruck und weisen Sie
[ODBC Source].[SQLCommand]
den folgenden Ausdruck zu Eigenschaft:(Weitere Informationen finden Sie unter Wie übergebe ich SSIS-Variablen in einem ODBC-SQLCommand-Ausdruck?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Wo MYTABLE
ist der Quelltabellenname und IDCOLUMN
ist Ihr Primärschlüssel oder Ihre Identitätsspalte.
Screenshot der Ablaufsteuerung
Referenzen
- ODBC-Quelle – SQL Server
- Wie übergebe ich SSIS-Variablen in einem ODBC-SQLCommand-Ausdruck?
- WIE VERWENDET MAN SSIS ODBC-QUELLE UND UNTERSCHIED ZWISCHEN OLE DB UND ODBC?
- Wie begrenze ich die Anzahl der Zeilen, die von einer Oracle-Abfrage nach der Bestellung zurückgegeben werden?
- Erste n bis n Zeilen von db2 abrufen
Update 1 - Andere mögliche Problemumgehungen
Bei der Suche nach ähnlichen Problemen habe ich einige zusätzliche Problemumgehungen gefunden, die Sie ausprobieren können:
(1) Ändern Sie den maximalen Arbeitsspeicher von SQL Server
-
SSIS:Der Buffer Manager hat einen Speicherzuweisungsaufruf fehlgeschlagen
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Benannte Pipes aktivieren
-
[Behoben] Der Puffermanager hat festgestellt, dass das System wenig virtuellen Speicher hat, konnte aber keine Puffer auslagern
- Gehen Sie zu Systemsteuerung –> Verwaltung -> Computerverwaltung
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Starten Sie den SQL-Instanzdienst neu
- Versuchen Sie danach, die Daten zu importieren, und es werden die Daten jetzt in Blöcken abgerufen, anstatt alle auf einmal. Ich hoffe, das wird für euch funktionieren und eure Zeit sparen.
(3) Wenn Sie SQL Server 2008 verwenden, installieren Sie Hotfixes
- Der SSIS 2008-Laufzeitprozess stürzt ab, wenn Sie das SSIS 2008-Paket mit wenig Arbeitsspeicher ausführen
Update 2 – Verstehen des Fehlers
In folgendem MSDN-Link wurde die Fehlerursache wie folgt beschrieben:
Der virtuelle Speicher ist eine Obermenge des physischen Speichers. Prozesse in Windows geben normalerweise nicht an, welche sie verwenden sollen, da dies (stark) einschränken würde, wie Windows Multitasking ausführen kann. SSIS weist virtuellen Speicher zu. Wenn Windows dazu in der Lage ist, werden alle diese Zuordnungen im physischen Speicher gehalten, wo der Zugriff schneller ist. Wenn SSIS jedoch mehr Arbeitsspeicher anfordert, als physisch verfügbar ist, wird dieser virtuelle Arbeitsspeicher auf die Festplatte verschüttet, wodurch das Paket um Größenordnungen langsamer arbeitet. Und im schlimmsten Fall, wenn nicht genügend virtueller Speicher im System vorhanden ist, schlägt das Paket fehl.