Best practices für die einfügen/Aktualisierung einer großen Menge von Daten in SQL Server 2008
Ich Baue ein system für die Aktualisierung von großen Datenmengen über verschiedene CSV-feeds. Normalerweise würde ich Schleife nur, wenn jede Zeile im feed, führen Sie eine select-Abfrage, um zu überprüfen, ob das Element bereits existiert und insert - /update-ein Element, je nachdem, ob es vorhanden ist oder nicht.
Habe ich das Gefühl diese Methode ist nicht sehr skalierbar und könnte hammer der server, auf größere feeds. Meine Lösung ist eine Schleife durch die Elemente, wie normal, aber speichern Sie Sie im Speicher. Dann für jeden 100 oder so posten ein select-auf diesen 100 Stück und bekommen Sie eine Liste von vorhandenen Einträgen in der Datenbank entsprechen. Dann verketten Sie die insert - /update-Anweisungen zusammen und führen Sie Sie in die Datenbank. Dies würde im wesentlichen zu reduzieren auf die Ausflüge in die Datenbank.
Ist dies eine Lösung, die skalierbar genug und gibt es irgendwelche Beispiel-tutorials auf den Import großer feeds in eine produktive Umgebung?
Dank
InformationsquelleAutor markvpc | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen, dass Sie SQL Server 2008 verwenden, würde ich empfehlen, diesen Ansatz:
Check-out die MSDN docs und ein große blog-post auf, wie Sie mit dem MERGE-Befehl.
Grundsätzlich, erstellen Sie eine Verknüpfung zwischen Ihrem eigentlichen Daten-Tabelle und die staging-Tabelle, die auf einer gemeinsamen Kriterien (z.B. einen gemeinsamen Primärschlüssel), und dann können Sie festlegen, was zu tun ist, wenn
Hätte man ein
MERGE
- Anweisung so etwas wie dieses:Natürlich, die
ON
- Klausel kann sehr viel mehr involviert, wenn nötig. Und natürlich IhrenWHEN
Aussagen können auch komplexer sein, z.B.und so weiter.
MERGE
ist eine sehr mächtige und sehr nützliche neue Befehl, der in SQL Server 2008 verwenden Sie es, wenn Sie können!InformationsquelleAutor marc_s
Eine Möglichkeit ist, laden Sie Ihre CSV-Datei in eine DataTable (oder eher ein DataReader) und dann batch-slam in den Ergebnissen mit SqlBulkCopy -
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
Seine ziemlich effizient, und Sie können tun, einige der Spaltenzuordnung. Tipp - wenn Sie Spalten zuordnen mit SqlBulkCopy Sie sind case-Sensitiv.
InformationsquelleAutor Kris Krause
Ihre Methode ist die denkbar schlechteste Lösung. Im Allgemeinen sollten Sie nicht denken in Bezug auf die Schleife durch die Datensätze einzeln. Wir verwendet, um havea ein Unternehmen integrierten import-tool durchläuft, reciords, die es dauern würde, 18-20 Stunden zum laden einer Datei mit über einer million Datensätzen (etwas, dass nicht ein häufiges Vorkommnis, wenn es gebaut wurde, aber das ist eine viele Male am Tag auftreten).
Sehe ich zwei Optionen:
Erste Verwendung von bulk insert zu laden, um eine staging-Tabelle und tun, was clean-up, die Sie tun müssen, um in der Tabelle. Wie sind Sie zu bestimmen, ob der Datensatz alrady existiert? Sie sollten in der Lage sein zu bauen, eine set-basierte Updates durch den Beitritt der staging-Tabelle auf die Felder, die bestimmen, dass das update. Oft habe ich einen Hinzugefügt, eine Spalte, meine staging-Tabelle für die id des Datensatzes übereinstimmt, und aufgefüllt werden, dass über eine Abfrage, dann erfolgt das update. Dann machst du ein insert der Datensätze, die nicht havea entsprechenden id. Wenn Sie zu viele Einträge um alles auf einmal tun, Sie möchten möglicherweise führen Sie in den Reihen (die ja eine Schleife), aber die batches, die erheblich größer sind, als 1 Datensatz zu einem Zeitpunkt (meist beginne ich mit 2000 und dann basierend auf der Zeit, die es dauert, bestimmen, ob ich mehr oder weniger im batch).
Ich denke 2008 hat auch eine merge-Anweisung, aber ich habe noch nicht die chance hatte, es zu benutzen. Schauen Sie in der Onlinedokumentation.
Die alternative ist die Verwendung der SSIS, die auf Geschwindigkeit optimiert. SSIS ist eine komplexe Sache, obwohl, und die Lernkurve ist steil.
Vielen Dank für Ihren Vorschlag. Der Grund, warum ich eine Schleife durch jedes Element ist, weil ich brauchen, um einige Validierung und Formatierung Logik vor dem hinzufügen der Datenbank. Diese werden dann mit relais zurück an den Benutzer, wenn es irgendwelche Probleme mit dem feed selbst. Ich mag die Idee der Zusammenführung der Daten, obwohl, ich werde in diesem Blick.
Sie können ganz einfach tun, Validierung und Formatierung in einem set-based Mode als auch. Beim Durchlaufen der einzelnen Datensätze ist fast immer eine schlechte Wahl, und Sie sollten nicht halten, es zu tun, bis alle anderen Optionen wurden elimiated.
InformationsquelleAutor HLGEM
Ein anderer Ansatz wäre, zu schreiben .Net stored procedure auf dem server auf dem server zu betreiben, auf die gesamte Datei...
Nur, wenn Sie mehr Kontrolle benötigen, als Kris Krause die Lösung, obwohl - ich bin ein großer fan von halten es einfach (und wiederverwendbar), wo wir können...
InformationsquelleAutor Martin Milan
Müssen Sie Ihre eigenen Rollen hier überhaupt? Wäre es möglich, die Daten in einer Weise, die der SQL Server verwenden kann, Massenimport, um es zu laden und dann befassen sich mit Duplikate in der Datenbank, sobald der import abgeschlossen ist?
Wenn es um schweres heben mit einer Menge von Daten, die meiner Erfahrung neigt zu sein, dass in der Datenbank arbeiten, so viel wie möglich, ist viel schneller und weniger ressourcenintensiv.
InformationsquelleAutor glenatron