Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Do 05.05.11 17:00 
Hallo Zusammen,

ich habe eine DataTable mit 32.000 Zeilen * 100 Spalten gefüllt. Das Schreiben in die Datenbank (SqlServer Compact sdf-Datei) hat sehr lange gedauert. Ich habe mir daher die einzelnen Schritte zeitlich protokolliert.

Das Performance Problem ist der Update-Befehl des Tableadapters (typisiertes Dataset).

Der Vorgang hat 7 Minuten gedauert. Die SDF-Datei ist jetzt 28 MB groß.

Eine Vermutung habe ich: Da ich am probieren bin, habe ich vorab fast alle Spalten mit dem Datentyp nvarchar(255) angelegt. Aber trotz der hohen Zeichenanzahl, kann das doch nicht so lange dauern.

Kann mir jemand sagen, wie ich meine Daten in kürzerer Zeit speichern kann?

Vielen Dank.

Frank
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 06.05.11 07:09 
Guten Morgen!

Müssen den wirklich immer so viele Datensätze gespeichert werden? Passt das Konzept wirklich?

_________________
Gruß
Christoph

Für diesen Beitrag haben gedankt: Oppi35
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 06.05.11 07:44 
100 Spalten ??????
Überarbeite mal dein Konzept!

Abgesehen davon kann es noch viele Ursachen geben, warum das so langsam ist:
  • Musst du wirklich jeden Datensatz updaten?
  • Hast du eine "vernünftige" Where-Klausel?
  • Benutzt du sinnvolle Indexe?
  • Gibt es vielleicht noch Trigger, die auf der Datenbank angestoßen werden?
  • Wird durch das Update noch zusätzlich etwas in deinem Programm angestoßen? Besonders dramatisch, wenn das in Exceptions endet.

Probier das Statement doch mal ohne Programm aus. Also direkt auf der DB.

Für diesen Beitrag haben gedankt: Oppi35
Oppi35 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Fr 06.05.11 08:03 
Vielen Dank für Eure Hilfe.

Ja, es müssen soviele Spalten sein.

Hintergrund:
Die Daten beziehe ich von einem SAS Server. Die Daten werden mit einem SAS-Makro aus einer Tabelle ausgewertet (aus einer Datei mit X Mio. Zeilen und 255 Spalten) und als Excel und csv-Datei auf der Festplatte gespeichert.

Die weiteren Schritte mit diesen erzeugten Tabellen möchte ich automatisieren. Es würde jetzt zu weit führen, dass im Detail zu erklären.

Es muss jeder Datensatz eingelesen werden.

Gruß
Frank
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 06.05.11 08:11 
Ok, klingt nach einer nervigen Sache. :mrgreen:
Trotzdem könnte man den Datensatz in mehrere Tabellen splitten. Für eine Gesamtansicht kann man das dann ja in einem View darstellen. Aber dafür kenne ich dein Konzept natürlich zu wenig.

Arbeitest du mit Transaktion? Falls ja, kann es sinnvoll sein, häufiger ein Commit zu machen, damit nicht soviel "Verwaltung" auf der DB laufen muss.
Da du ja ein Insert vor dem Update machen musst, wäre es vielleicht möglich das zu kombinieren. Also die Anpassungen an den Datensatz vor dem Insert zu machen. Damit würdest du dir das Update evtl. komplett sparen können.

Für diesen Beitrag haben gedankt: Oppi35
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Fr 06.05.11 13:55 
ok das sind ne menge spalten und reihen, aber 7 minuten nur fürs updaten? falls du die werte im datagrid o.ä. darstellst prüfe mal ob diese beim updaten aktuallisiert wird. wenn ja prüfe weiter ob du die autosize eigenschaften für die zellen deaktiviert hast. autosize ist ein wahrer performancekiller.

ich aktuallisiere eine tabelle mit 40 spalten (auch fast alles string datentypen) und ca.1500 zeilen in einem bruchteil von 1 sekunde.

Für diesen Beitrag haben gedankt: Oppi35