4 Stimmen

Wie beschleunige ich eine SSIS Transfer Server Objects Aufgabe, die wirklich langsam läuft?

In SSIS 2005 habe ich den Import/Export-Assistenten verwendet, um ein Paket zu erstellen, das die Daten in einigen Tabellen zwischen meinem Produktionsserver und dem Entwicklungscomputer löscht/neu erstellt und ersetzt. Der vom Assistenten erstellte Kontrollfluss war extrem kompliziert, also habe ich ein neues Paket erstellt und die Aufgabe "Transfer SQL Server Objects Task" verwendet, die im Gegensatz zu dem verrückten Ding, das der Assistent erstellt hat, wirklich einfach zu konfigurieren und einzurichten ist. Das Problem ist, dass die Ausführung des von mir erstellten Pakets über 3 Minuten dauert, während die Version des Assistenten etwa 20 Sekunden benötigt. Warum ist der Unterschied in der Ausführungszeit so groß und gibt es eine Einstellung, die ich in dem Paket, das die Aufgabe "Objekte übertragen" verwendet, ändern kann, damit es schneller ausgeführt wird?

Hier ist das Paket, das der Assistent erstellt hat. Ich habe bereits ähnliche Pakete mit dem Assistenten erstellt, die ich problemlos bearbeiten konnte, aber so etwas habe ich noch nie gesehen. Ich kann nicht herausfinden, wo ich die Tabellen und das Schema ändern kann, die ich ablege und erstelle. Alt-Text http://www.freeimagehosting.net/uploads/f7323b2ce3.png

Hier sind die Eigenschaften der Transferaufgabe innerhalb des for-Schleifen-Containers

Alt-Text http://www.freeimagehosting.net/uploads/6f0dfc8269.png

1voto

James Wiseman Punkte 29172

Welche Verbindungsart verwenden Sie?

Wenn ich hier zwischen Oracle und SQL wechseln möchte, ist der ADO.NET-Anbieter um Längen langsamer als der Oracle OLE DB-Anbieter.

0 Stimmen

Die einzige Verbindungsoption, die mir bei dieser Aufgabe zur Verfügung steht, ist eine SMO-Verbindung, und ich versuche, Objekte zwischen 2 Sql-Server-Instanzen zu übertragen. Ich habe OLEDB-Verbindungen im Verbindungsmanager aufgelistet, weil ich dachte, dass ich sie zuerst verwenden könnte, aber ich konnte sie nicht auswählen.

1voto

Sam Punkte 7422

Warum nicht das vom Assistenten generierte Paket verwenden und herausfinden, was es tut? Es arbeitet offensichtlich sehr effizient.

0 Stimmen

Siehe mein aktualisiertes Bild des Pakets. Sagen Sie mir, wo ich die Tabellen, die ich löschen und neu erstellen möchte, ändern kann, denn ich kann sie nicht finden. Die Aufgabe Objekt übertragen, die langsam läuft, ist leicht zu konfigurieren, aber langsamer als eine Schnecke.

1voto

RailRhoad Punkte 2068

Das kann eine ganze Reihe von Dingen sein. Führen Sie Lookups durch? Wenn ja, verwenden Sie stattdessen Joins. Sie können auch ein DB-Profil ausführen, um zu sehen, was das verrückte Paket im Gegensatz zu Ihrem benutzerdefinierten Paket tut.

0 Stimmen

Ich führe nur die Aufgabe "Objekte übertragen" aus, die ein paar Tabellen löscht und neu erstellt und weniger als 2000 Zeilen für etwa 10 Tabellen kopiert.

1voto

James Black Punkte 41034

Ich verwende den Assistenten nicht, aber könnte er eine gespeicherte Prozedur erstellt haben, die die Arbeit tatsächlich erledigt? Das würde erklären, wie es schneller geht, da die gespeicherte Prozedur die gesamte Arbeit innerhalb der Datenbank erledigen kann.

Ich bin neugierig, was in den TransferTask denn dort scheint die ganze Arbeit gemacht zu werden.

Sie könnten versuchen, die Daten in eine flache Datei zu exportieren und dann einen Massenimport zu verwenden, um dies schneller zu erledigen.

Einige weitere Gedanken darüber, wie schnell die Dinge gehen, finden Sie hier, aber am wichtigsten sind einige der Kommentare, die gegeben wurden, wie zum Beispiel, wie er Bulk Insert falsch verwendet.

http://weblogs.sqlteam.com/mladenp/articles/10631.aspx

UPDATE Sie sollten sich auch dies ansehen: http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/title-12 da er gegen Ende zeigt, wie lange seine Tests dauerten, aber der erste Kommentar ist vielleicht der nützlichste Teil, um den Import zu beschleunigen.

0 Stimmen

Ich habe das Eigenschaftsfenster für dieses Objekt hochgeladen. Ich kann sehen, dass es eine Variable "CurrentTableNode" für die Eigenschaft TableMetaDataNodeVariableName, aber ich kann erraten, kommt von der smo_pubs Verbindung oder das innere Paket, aber ich versuche und klicken Sie auf die Eigenschaften dieser Verbindungen und nichts macht Sinn für mich.

1voto

James Anderson Punkte 26827

Diese Art von Leistungsproblemen ist in der Regel auf die "Commit"-Stufen und die Protokollierung zurückzuführen.

Die vom Assistenten generierte Aufgabe führt eine "Starttransaktion" durch, bevor sie in die Schleife eintritt, und führt eine Festschreibung durch, nachdem alle Daten übertragen wurden. Dies ist die beste Vorgehensweise, wenn die Tabelle nicht "riesig" ist.

Haben Sie "autocommit" in Ihrer handcodierten Version eingeschaltet gelassen?

0 Stimmen

Ich konnte weder für den Task Transfer SQL Server Objects noch in den SMO-Verbindungsmanagern Optionen vom Typ "autocommit" finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X