Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SSIS kann Pakete nicht speichern und startet Visual Studio neu

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.

  1. Deklarieren Sie 2 Variablen vom Typ Int32 (@[User::RowCount] und @[User::IncrementValue] )
  2. Fügen Sie eine Execute SQL Task hinzu die einen select Count(*) ausführen Befehl und speichern Sie die Ergebnismenge in der Variablen @[User::RowCount]

  1. Fügen Sie eine For-Schleife mit den folgenden Einstellungen hinzu:

  1. Fügen Sie innerhalb des for-Schleifen-Containers eine Data flow task hinzu
  2. Fügen Sie innerhalb der Datenflussaufgabe eine ODBC Source hinzu und OLEDB Destination
  3. Wählen Sie in der ODBC-Quelle SQL Command aus Option und schreiben Sie ein SELECT * FROM TABLE query *(um nur Metadaten abzurufen`
  4. Ordnen Sie die Spalten zwischen Quelle und Ziel zu
  5. Gehen Sie zurück zum Control flow und klicken Sie auf die Data flow task und drücken Sie F4 um das Eigenschaftsfenster anzuzeigen
  6. 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

    1. Gehen Sie zu Systemsteuerung –> Verwaltung -> Computerverwaltung
    2. On Protocol for SQL Instance -> Set Named Pipes =Enabled
    3. Starten Sie den SQL-Instanzdienst neu
    4. 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.