Was ist der schnellste Weg, um eine Tabelle in eine Textdatei zu exportieren


17

Ich werde eine SQL Server 2012-Datenbank und eine Tabelle mit 3 Millionen Zeilen und vielleicht 50 Spalten haben. Was ist der schnellste Weg für einen unbeaufsichtigten .net-Hintergrundprozess (gibt möglicherweise einen SQL- oder Powershell-Befehl aus), um ihn in eine Textdatei zu exportieren, eine Zeile für jede Datenzeile? Der .net-Prozess sollte wissen, wann der Export abgeschlossen wurde oder ob ein Fehler aufgetreten ist. Der Datentyp ist all intoder nvarchar.

Ich gehe davon aus, dass ein reiner C # -Code, der ado.net verwendet, um einen select *Befehl auszuführen, den Daten- Reader zu durchlaufen und für jeden Datensatz in eine Datei zu schreiben, langsam ist und ich dies auf keinen Fall parallelisieren kann.

Im Idealfall erfolgt der Export in einen freigegebenen Remote-Netzwerkordner und nicht in einen lokalen Ordner auf dem SQL Server-Computer. Der SQL Server wird ein HA-Cluster sein. Ist SSIS dafür besser geeignet, keine Datenumwandlung erforderlich?

Der .Net-Prozess würde auf Computer A und SQL Server auf Computer B ausgeführt, und das endgültige Dateiziel ist eine Netzwerkfreigabe. Eine Option ist, dass SQL Server die Datei direkt auf die Netzwerkfreigabe schreibt. Die andere Option besteht darin, dass SQL Server auf Computer A schreibt. Wenn die Datei geschrieben wird, kopiert der .NET-Prozess sie auf die Netzwerkfreigabe. Ich habe keine formelle SLA, erwarte aber 30 Minuten - 1 Stunde für das Schreiben der Datei.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- Woher wird die .NET-App ausgeführt? Dies könnte im schlimmsten Fall bedeuten, dass die Daten zwei Netzwerksprünge durchlaufen müssen, was wahrscheinlich den größten Engpass darstellt. Auch die Anzahl der Zeilen spielt keine Rolle - wie hoch ist die ungefähre Gesamtdatengröße? Haben Sie eine Leistungs-SLA, die Sie für diesen Prozess einhalten müssen?
Jon Seigel

Antworten:


10

Das Durchstöbern all dieser Artikel ist eine Option, wenn Sie sich die Zeit vertreiben möchten, während Sie sie ausführen.

Einige verschiedene Optionen, die Sie ausprobieren sollten, sind:

Und Sie können all diese Optionen ausprobieren, während Sie in einer anderen Sitzung eine Schleife abspielen, nur zum Spaß :-).


4

Ich würde einfach den Import Export Wizard verwenden. Am Ende haben Sie die Möglichkeit, die Aufgabe zu speichern, die Sie dann mit dem SQL Server-Agenten planen können. Fügen Sie sich als Operator hinzu und konfigurieren Sie DB Mail auf dem Server. Sie erhalten dann eine E-Mail, wenn der Auftrag abgeschlossen ist oder fehlschlägt.

Ernsthaft, warum das Rad neu erfinden?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


Gar nicht so schlecht, eigentlich spart das am Ende ein SSIS-Paket. Wenn es sich um eine einmalige Aufgabe handelt, kann dies eine Lösung sein.
Marian

2

Andere haben angegeben, dass bcp der schnellste Weg sein sollte, aber ich sehe keinen Vorteil gegenüber einer CLR-Lösung. Bei Einfügungen in Datenbanktabellen gewinnen die verschiedenen Massenkopieimplementierungen immer. Dies liegt hauptsächlich an der Art und Weise, wie sie die Protokollierung minimieren und Multi-Thread-Schreibvorgänge ermöglichen. Sie haben diese Einschränkungen nicht, wenn Sie in eine flache Datei schreiben.

Bei meiner Arbeit verwenden wir eine CLR, um die Abfrageausgabe in eine Datei zu speichern. Wir integrieren auch die Ionic.Zip.dll, damit die Datei nach der Erstellung automatisch gezippt werden kann.

Hier ist ein Beispiel, von dem die Operation behauptet, dass sie bei Blobs doppelt so schnell ist wie bei BCP: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


Diese spezielle Frage ist nicht sehr detailliert. Ich empfehle Ihnen, die folgende Frage zu lesen - Optimieren der BCP-Leistung für BLOB-Daten hier. Es wird sicherlich eine Vorstellung von den vielen Spieloptionen geben, die Sie nur bei BCP haben :-).
Marian

Ich sehe die Links und stimme voll zu. Die meisten Optimierungspunkte dienen jedoch dem Laden von Daten in den SQL Server. Ich habe bisher noch keine Fakten darüber gesehen, dass bcp schneller ist als eine Streamwriter- oder Filestream-CLR-Lösung, wenn SQL-Daten in eine flache Datei geschrieben werden.
Brian

1

Sie können ein einfaches SSIS-Paket erstellen:

Hier erfahren Sie, wie Sie:

  1. Erstellen Sie im Verbindungsmanager eine OLEDB-Verbindung zur Datenbank
  2. Ziehen Sie eine Datenfluss-Transformation in den Kontrollfluss und klicken Sie darauf, um zum Datenfluss zu gelangen.
  3. Ziehen Sie eine OLEDB-Quelle aus der Toolbox in den Datenfluss und bearbeiten Sie sie so, dass sie mit der in Schritt 1 erstellten Verbindung eine Verbindung zu Ihrer gewünschten Tabelle herstellt
  4. Ziehen Sie ein Flat File-Ziel aus der Toolbox in den Datenfluss und verbinden Sie die OLEDB-Quelle damit.
  5. Wählen Sie "Neu" im Flatfile-Ziel, und es wird eine neue Flatfile mit der gleichen Spaltenstruktur erstellt, und Sie können das gewünschte Trennzeichen verwenden, oder möglicherweise ein Fix mit Datei, wenn Sie das mögen.
  6. Starte es.

Jeder Noob sollte das herausfinden können. Eine Anti-GUI-Person würde diese Lösung nicht mögen. Speichern Sie also die Kommentare in dieser Hinsicht. Es ist nur eine Alternative für weniger technisch versierte Personen, die Probleme mit der Verwendung von BCP haben.

Sie haben etwas mehr Flexibilität bei der Formatierung der Datendatei. Sie können dies in BCP und all dem tun, aber das entlastet die Komplexität. Es gibt jedoch einen kleinen Vorteil: Sie können einen benutzerdefinierten Dateiheader einfügen und einen "Spaltennamen" als erste Zeile erstellen, wodurch die flache Datei für den menschlichen Gebrauch besser geeignet ist.

Vergessen Sie nicht, es zu speichern. Wenn Sie es einmal erstellt haben, werden Sie wahrscheinlich erneut gefragt! Hoffe das hilft..


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.