Hallöle,
heute beschäftige ich mich mit dem INSERT INTO und UPDATE auf eine Datenbanktabelle.
Dabei habe ich festgestellt, dass ein INSERT INTO von 10.000 Datensätzen (mit 11 Spalten)
ca. 24 Sekunden dauert, während ein Update aller Datensätze 36 Minuten dauert.
Krasser Unterschied würde ich mal sagen.
Mein Problem beim INSERT INTO ist, dass sich die Anzahl der Spalten ändern kann.
Mit einer Schleife hole ich mir die Anzahl und Namen der Spalten, kann diese
aber ja nicht dynamisch in den INSERT INTO Query einbauen.
Deswegen habe ich das mit einer UPDATE-Anweisung umgesetzt.
Es wird also vorher die Tabelle mit den entsprechenden Spalten erzeugt.
Auch die Anzahl an Datensätzen ist dann schon bekannt.
Zusätzlich erstelle ich am Anfang die Spalte ID, die die Datensätze durchnummeriert.
Die anderen Spalten (z. B. Spalte 1 bis 11) sind leer
Die Tabelle sieht also wie folgt aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| +-------+----------+-----+-----------+ | ID | Spalte 1 | ... | Spalte 11 | +-------+----------+-----+-----------+ | 1 | NULL | ... | NULL | +-------+----------+-----+-----------+ | ... | ... | ... | ... | +-------+----------+-----+-----------+ | 10000 | NULL | ... | NULL | +-------+----------+-----+-----------+ |
Mit einer Schleife führe ich den UPDATE Query aus.
C#-Quelltext
1:
| SqlCommand WORT = new SqlCommand("UPDATE " + file[c] + " SET " + value[j] + " = '" + va[j] + "' WHERE ID = " + durchgang, con); |
file[c] enthält den Tabellennamen
value[j] enthält den entsprechenden Spaltennamen
va[j] enthält den Wert, der eingetragen werden soll
Damit das in der korrekten Zeile passiert, greife ich auf die ID zu.
Die Variante mit dem UPDATE funktioniert fehlerfrei, allerdings dauert das sehr lange.
Welche Möglichkeiten gibt es, um den UPDATE Query zu beschleunigen?
Ich habe schon etwas über INDEX gelesen, verstehe das aber so, dass es eher bei SELECT Anweisungen
greift. Die Tabelle hat keinen von mir vergebenen INDEX. Die Spalte Dummy ist PK.
Mit einem SqlBulkCopy habe ich es auch schon versucht, bekomme ab einer gewissen Größe
allerdings eine OutOfMemory Exception.
Danke und Gruß
CfB
Moderiert von Th69: C#-Tags hinzugefügt