Frage

Ich baue ein System für große Datenmengen über verschiedenen CSV-Feeds aktualisieren. Normalerweise würde ich in der Zufuhr obwohl jede Zeile nur Schleife, führen Sie eine SELECT-Abfrage zu überprüfen, ob das Element bereits vorhanden ist und insert / update ein Element je nachdem, ob es existiert oder nicht.

Ich fühle mich diese Methode nicht sehr skalierbar ist und könnte den Server auf größeren Feeds hämmern. Meine Lösung ist durch die Elemente wie gewohnt Schleife, sondern speichert sie im Speicher. Dann gilt für alle 100 oder so Artikel tun, um eine Auswahl auf diesen 100 Elemente und eine Liste der vorhandenen Elemente in der Datenbank, dass Spiel bekommen. Dann verketten die insert / update-Anweisungen zusammen und sie in die Datenbank. Dies würde schneidet im Wesentlichen nach unten auf den Reisen in die Datenbank.

Ist das eine skalierbare Lösung genug und gibt es beispielsweise Anleitungen zum Importieren von großen Feeds in eine produktive Umgebung?

Danke

War es hilfreich?

Lösung

Sehen, dass Sie SQL Server 2008 verwenden, würde ich diesen Ansatz empfehlen:

  • erste bulkcopy Ihre CSV-Dateien in eine Staging-Tabelle
  • aktualisieren Sie Ihre Zieltabelle aus dieser Staging-Tabelle des MERGE Befehl mit

Schauen Sie sich die MSDN docs und ein großer Blog Post , wie der MERGE Befehl verwenden.

Grundsätzlich Sie eine Verbindung zwischen Ihrer tatsächlichen Datentabelle erstellen und der Staging-Tabelle auf einem gemeinsamen Kriterien (zum Beispiel eines gemeinsamer Primärschlüssel), und dann können Sie definieren, was wann zu tun

  • die Zeilen entsprechen, z.B. die Zeile existiert sowohl in der Ausgangs- und die Zieltabelle -> Regel werden Sie entweder aktualisieren einige Felder, oder einfach alle zusammen ignorieren
  • die Zeile aus der Quelle existiert nicht im Ziel -> typischerweise einen Fall für eine INSERT

Sie würden eine MERGE Aussage etwas wie diese:

MERGE TargetTable AS t
USING SourceTable AS src
ON t.PrimaryKey = src.PrimaryKey

WHEN NOT MATCHED THEN
  INSERT (list OF fields)
  VALUES (list OF values)

WHEN MATCHED THEN
  UPDATE
    SET (list OF SET statements)
;

Natürlich kann die ON Klausel viel mehr beteiligt, wenn nötig. Und natürlich Ihre WHEN Aussagen können auch komplexer sein, z.

WHEN MATCHED AND (some other condition) THEN ......

und so weiter.

MERGE ist ein sehr leistungsfähiger und sehr nützlicher neuer Befehl in SQL Server 2008 - es verwenden, wenn Sie können

Andere Tipps

Ihr Weg ist die denkbar schlechteste Lösung. Im Allgemeinen sollten Sie denken, nicht in Bezug auf die einzeln durch die Datensätze Looping. Wir haben eine Firma gebaut Import-Tool haben, dass Schleifen durch Aufzeichnungen, es 18-20 Stunden dauern würde, eine Datei mit mehr als einer Million Datensätze zu laden (etwas, das nicht häufig vorkommt, als es gebaut wurde, aber das ist ein oft ein Tag Auftreten jetzt).

ich zwei Optionen zur Verfügung: Erster Einsatz Masseneinsatz Last auf eine Staging-Tabelle und tun, was aufzuräumen Sie auf dieser Tabelle tun müssen. Wie werden Bestimmen Sie, ob der Datensatz bereits vorhanden ist? Sie sollten, die die Aktualisierung bestimmen durch den Beitritt in den Staging-Tabelle auf diesen Feldern eine Set-basierte Update aufbauen können. Ich habe oft eine eine Spalte meine Staging-Tabelle für die ID des Datensatzes hinzugefügt, um es zu übereinstimmt und bevölkert, dass durch eine Abfrage dann das Update durchgeführt. Dann Sie einen Einsatz der Aufzeichnungen tun, die keine entsprechende ID haben. Wenn Sie zu viele Datensätze auf einmal zu tun, mögen Sie vielleicht in Chargen fahren (die ja eine Schleife), aber die Chargen deutlich größer als 1 Datensatz zu einem Zeitpunkt machen (ich in der Regel mit 2000 starten und dann auf der Grundlage des Zeit, die es dauert, dass festzustellen, ob ich mehr oder weniger in der Charge tun).

Ich denke, 2008 hat auch eine merge Aussage, aber ich habe noch nicht die Chance hatte, es zu benutzen. Schauen Sie online in Büchern auf.

Die Alternative ist, SSIS zu verwenden, die für Geschwindigkeit optimiert ist. SSIS ist eine komplexe Sache, obwohl und die Lernkurve ist steil.

Eine Möglichkeit ist, Ihre CSV in eine Datatable laden (oder eher einen Datareader) und dann Batch-Slam in den Ergebnissen SqlBulkCopy mit -

http://msdn.microsoft.com /en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

Es ist ziemlich effizient und Sie können einige Spaltenzuordnung tun. Tipp - wenn Sie Spalten Karte mit SqlBulkCopy sie sind Groß- und Kleinschreibung

.

Ein weiterer Ansatz wäre, eine .NET gespeicherte Prozedur auf dem Server auf dem Server zu schreiben, auf der gesamten Datei zu arbeiten ...

Nur wenn Sie mehr Kontrolle benötigen, als Kris Krause Lösung obwohl - ich ein großer Fan von bin halten es einfach (und wiederverwendbar), wo wir können ...

Sie benötigen Ihre eigene hier überhaupt zu rollen? Wäre es möglich, die Daten in einer solchen Art und Weise zur Verfügung zu stellen, dass der SQL Server-Massenimport verwenden kann es in zu laden und dann mit Dubletten in der Datenbank umgehen, wenn der Import abgeschlossen ist?

Wenn es mit einer Menge von Daten zu schwerem Heben kommt meine Erfahrung neigt wie möglich zu sein, dass so viel in der Datenbank arbeitet, ist viel schneller und weniger ressourcenintensiv.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top