Announcement

Collapse
No announcement yet.

File über DataSet in Datenbank füllen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • File über DataSet in Datenbank füllen

    Hallo zusammen

    Folgende Situation:

    Wir erhalten pro Tag eine Datei mit mindestens 250'000 Zeilen welche in ca. 6 verschiedene Tabellen abgefüllt werden. Die Datei wird Zeile für Zeile in die verschiedenen Tabellen abgefüllt. Dies dauert nicht mehr als 10 - 20 Sekunden (!), jedoch der Commit-Befehl welcher mittels Adapter ausgeführt wird, dauert danach ca. 45 Minuten.

    Gibt es da eine Möglichkeit diesen Vorgang zu beschleunigen?

  • #2
    Hallo und willkommen,

    die Problembeschreibung deutet darauf hin, dass keine Transaktionen benutzt werden, sondern jeder neue Datensatz einzeln zur DB geschaufelt wird. Das ist der gängigste Fehler, wenn eine Reihe von Zeilen per Schleife und ExecuteNonQuery gespeichert wird.

    Landen die Zeilen der Datei in DataTables eines DataSet? Wenn ja, wie kommen sie dann in die Datenbank? Verstehe ich deine Beschreibung richtig, dass das per Update-Befehl eines DbDataAdapters erledigt wird? Dann sollte es eigentlich schneller gehen. Benutzt du dafür einen TableAdapter? Dann müsstest du intern prüfen, wie der aufgebaut ist.

    Gruß Jürgen

    Comment


    • #3
      Die Datei wird Zeile für Zeile in die verschiedenen Tabellen abgefüllt. Dies dauert nicht mehr als 10 - 20 Sekunden (!)
      Meinst du das einfügen in Datatables? Das würde mich nicht wundern das ist ja reines In Memory schubsen.

      , jedoch der Commit-Befehl welcher mittels Adapter ausgeführt wird, dauert danach ca. 45 Minuten.
      Wenn du meinst du rufst Adapter.Update auf dann ist das dann das erste mal das an die Datenbank gegangen wird. Jeder Datensatz wird einzeln! zum inserten/updaten an die Datenbank gesendet. Es finden also zwischen DB-Server und deinem Programm 250000 Ping Pongs statt das jeweils mindestens mehrere Millisekunden dauert plus die jeweiligen Millisekunden der SQL Ausführung. Das kann nicht schnell gehen.

      Massenupdates über eine Clienttechnologie wie ADO.NET zu machen ist mehr als unglücklich. Du solltest dich mit den Bulkupdate Mechanismen deiner Datenbank auseinandersetzen.

      Comment


      • #4
        Okay, wir wenden nun SqlBulkCopy an, das funzt sogar recht gut! Thx für den Tipp! Statt den 45 Minuten haben wir die Wartezeit nun auf 25 Minuten verkürzt. Jedoch geht bei mir eine Rechnung nicht auf: Für ca. 7'800 Datensätze braucht er knapp 3 Sekunden, jedoch für 27'000 fast 25 Minuten? Kann das sein?

        Comment


        • #5
          Das klingt in der Tat unwahrscheinlich. Aber um mehr zu sagen, müssen wir mehr wissen: Verteilung der Datensätze auf die Tabellen, Strukturen, Einzelbefehle der Ausführung. Jürgen

          Comment


          • #6
            Kannst du ermitteln in welchem Teil deiner Anwendung die Zeit wirklich drauf geht(Stichwort Profiler)?

            Wenn du alles in einem Rutsch machst könnte dir zum Beispiel ab einer bestimmten Größe der Speicher für die Anwendung ausgehen wenn du dir denn Speicher mit Daten aus der Datenquelle vollschreibst. Dann verlierst du Zeit nicht beim ~BulkInsert~ sondern beben eim Swappen der Anwendung auf Platte. Dann hilft es vielleicht schon die BatchSize der SqlBulkCopy explizit auf einen relativ kleinen Wert zu setzen (5000-10000) und die die Daten aus der Datenquelle(wie du das auch immer machst) ebenfalls in entsprechenden Batches zu lesen und dann frühest möglich wieder freizugeben.

            Aber wie schon Jürgen bemerkt ohne mehr Details bleibts es beim raten.

            Comment

            Working...
            X