2017-02-22 6 views
1

ich um 100k zeichnet ein paar Dutzend Mal am Tag in ein AWS gehosteten SQL Server Web 13.00.2164.0.v1SQLServer große Import ohne Massenkopieren oder SSIS

AWS importieren müssen nicht Masseneinfügung nicht unterstützt, und SQL Server Web unterstützt SSIS nicht.

Ich lese Datensätze aus einer CSV-Datei mit einer C# -Konsolenanwendung, führen einige Datentransformationen durch und fügen dann jeweils 1 Datensatz mit SqlCommand unter einer einzigen Transaktion pro 100k-Datensatzdatei ein.

Meine aktuelle Rate ist um 25k Datensätze pro 30 Minuten, die lächerlich langsam scheint. Ich hatte diesen Prozess ursprünglich mit Masseneinsätzen entwickelt und konnte in etwa einer Minute 100k Datensätze einfügen. Kann ich etwas tun, um dies zu beschleunigen?

Antwort

1

Die native Weg, es zu tun ist, Table-Valued Parameters zu verwenden.

Siehe auch Table-Valued Parameters in .NET für Erläuterungen zur Verwendung in Ihrem C# -Code.

Erstellen Sie also eine gespeicherte Prozedur, die einen Tabellenwert akzeptiert und alle 100 K Zeilen in einem Aufruf übergeben. Sie können versuchen, mit der Größe der Charge zu experimentieren und kleinere Chargen zu versuchen, aber 100K ist nicht zu viel.

In dieser gespeicherten Prozedur gibt es eine einzelne INSERT-Anweisung, die Zeilen aus der Parametertabelle in die permanente Tabelle einfügt.

Es wird definitiv schneller als das Einfügen von einer Zeile zu einer Zeit.

1

Sie müssen Ihre Daten im XML-Format konvertieren und dann diese XML-Daten in SQL übertragen. Wie im Beispiel

Daten aus einem Dataset in das XML-Format übertragen. String objStr = ds.GetXml(); // ds ist ein Datensatz Objekt, das Tabellendaten

an Datenbank Ende enthält:

CREATE PROCEDURE [dbo].[procedure name] 
    -- Add the parameters for the stored procedure here 
    @Val varchar(max) = null 

AS 
BEGIN 
    declare @xml xml 
    set @xml = convert(xml,@Val) 

    SELECT 
     T.Node.value('colname[1]', 'numeric(18, 2)') AS colname 
    FROM 
     @xmlValue.nodes('/NewDataSet/Table0') AS T(Node) 
END 
+0

Dies sollte gut tun. Ich plane die Implementierung einer Erweiterung für SqlBulkCopy, die den Namen der Zieltabelle, Feldzuordnungen und Quelltabelle übernimmt und dynamisch eine passende Prozedur erstellt. Danke für den Schub in die richtige Richtung. Ich markiere akzeptiert und poste mein Endergebnis, sobald ich es laufen lasse. – Broom