inserts in DataTable - Geschwindigkeit erhöhen

30/06/2009 - 14:20 von Armin Schäfer | Report spam
Hallo Leute,

ich möchte gerne ein wenig mehr Performance in einem Teil meiner Applikation
erreichen. Dazu schreibe ich erstmal, was die Applikation macht und wie ich
es bisher erledige.

Die Daten selber kommen aus einer Access Tabelle, werden aber in ein
DataTable in C# eingelesen und werden nicht mehr zur Access Datenbank
zurückgeschoben, so dass man sich das DataTable als völlig losgelöst von der
eigentlichen Datenbank vorstellen kann.

Es handelt sich um eine Simulation, in der ich - mittels eines for
Schleifenkonstrukts - verschiedene Zeitràume durchlaufe. Dabei werden nach
verschiedenen Kriterien einzelne Datensàtze (also Tabellenzeilen) als
gelöscht markiert und bei Bedarf neue Datensàtze erfunden. Die neuen
Datensàtze erhalten dabei zufàllig das Aussehen eines bereits gelöschten
Datensatzes. Nur das Geburtsdatum wird dabei veràndert.

Der zeitintensive Faktor scheint nach meinen Analysen das Einfügen eines
neuen DataRows zu sein. hier jetzt einmal ein bisschen von meinem Quellcode:

DataRow[] foundRows;
// Use the Select method to find all rows matching the
filter.
string expression = "geloescht='" + Simulationsdatum + "' OR
geloescht='" + Simulationsdatum + " Rückgang' OR geloescht='" +
Simulationsdatum + " Fluktuation'";
foundRows = gewaehlteDaten.Select(expression);
if (foundRows.Length > 0)
{
// ja, es wurden Datensàtze gelöscht, also einen
zufàllig auswàhlen und dessen Daten übernehmen
Zufallszeile = foundRows[rnd.Next(foundRows.Count())];
}
else
{
// es wurden noch keine gelöscht, dann zufàllig einen
neuen Datensatz erzeugen
Zufallszeile =
gewaehlteDaten.Rows[rnd.Next(foundRows.Count())];
}

DataRow neuerSatz;
neuerSatz = gewaehlteDaten.NewRow();
neuerSatz.ItemArray = Zufallszeile.ItemArray;
neuerSatz[Geburtsdatum] = neuerGeburtstag;
neuerSatz[Nr] = "neu";
neuerSatz["geloescht"] = "nein";

gewaehlteDaten.Rows.Add(neuerSatz);

// zur Simulations DataTable hinzufügen
DataRow SimZeile = Simulationsdaten.NewRow();
SimZeile["Kriterium"] = Zufallszeile[cKriterium.Text];
SimZeile["Simulationsdatum"] = Simulationsdatum;
SimZeile["Geburtsdatum"] = neuerGeburtstag;
Simulationsdaten.Rows.Add(SimZeile);

Zufallszeile["wiederhergestellt"] = Simulationsdatum;

Wenn ich jetzt alle Änderungen irgendwie / irgendwo zwischenspeichern könnte
und sie dann spàter Bulk ausführen könnte, würde es vermutlich einiges an
Geschwindigkeit bringen. Aber ich wie kann ich mittels .NET und C# so eine
Bulk Operation anstossen. Hat jemand eine Idee?`

Ciao, Armin
 

Lesen sie die antworten

#1 Andreas Peterschofsky
30/06/2009 - 16:43 | Warnen spam
Ich versteh nicht ganz warum Du teilweise Neue Datensàtze anstatt der
alten eintragen willst und teilweise neue generieren?

Warum verwendest Du nicht einfach eine DataTable und führst darin Deine
Änderungen durch?

myDataTable.Rows[x].Delete();
myDataTable.NewRow();

etc.

Da hast Du an jeder Reder den Status (Added, Deleted, Modified) und
kannst am Schluss mit einem DataAdapter die Änderungen zurückschreiben.

Die Änderungen an einer DataTable sind im Allgemeinen recht flott.
Wennst Dir dieser Overhead auch zuviel ist, dann kannst eigentlich nur
Deinen Änderungen in einer Liste zwischenspeichern und dann am Ende
gesammelt ausführen...

lg
Andreas



Armin Schàfer wrote:

Hallo Leute,

ich möchte gerne ein wenig mehr Performance in einem Teil meiner
Applikation erreichen. Dazu schreibe ich erstmal, was die Applikation
macht und wie ich es bisher erledige.

Die Daten selber kommen aus einer Access Tabelle, werden aber in ein
DataTable in C# eingelesen und werden nicht mehr zur Access Datenbank
zurückgeschoben, so dass man sich das DataTable als völlig losgelöst von
der eigentlichen Datenbank vorstellen kann.

Es handelt sich um eine Simulation, in der ich - mittels eines for
Schleifenkonstrukts - verschiedene Zeitràume durchlaufe. Dabei werden
nach verschiedenen Kriterien einzelne Datensàtze (also Tabellenzeilen)
als gelöscht markiert und bei Bedarf neue Datensàtze erfunden. Die neuen
Datensàtze erhalten dabei zufàllig das Aussehen eines bereits gelöschten
Datensatzes. Nur das Geburtsdatum wird dabei veràndert.

Der zeitintensive Faktor scheint nach meinen Analysen das Einfügen eines
neuen DataRows zu sein. hier jetzt einmal ein bisschen von meinem
Quellcode:

DataRow[] foundRows;
// Use the Select method to find all rows matching the filter.
string expression = "geloescht='" + Simulationsdatum + "' OR
geloescht='" + Simulationsdatum + " Rückgang' OR geloescht='" +
Simulationsdatum + " Fluktuation'";
foundRows = gewaehlteDaten.Select(expression);
if (foundRows.Length > 0)
{
// ja, es wurden Datensàtze gelöscht, also einen zufàllig auswàhlen und
dessen Daten übernehmen
Zufallszeile = foundRows[rnd.Next(foundRows.Count())];
}
else
{
// es wurden noch keine gelöscht, dann zufàllig einen neuen Datensatz
erzeugen
Zufallszeile = gewaehlteDaten.Rows[rnd.Next(foundRows.Count())];
}

DataRow neuerSatz;
neuerSatz = gewaehlteDaten.NewRow();
neuerSatz.ItemArray = Zufallszeile.ItemArray;
neuerSatz[Geburtsdatum] = neuerGeburtstag;
neuerSatz[Nr] = "neu";
neuerSatz["geloescht"] = "nein";

gewaehlteDaten.Rows.Add(neuerSatz);

// zur Simulations DataTable hinzufügen
DataRow SimZeile = Simulationsdaten.NewRow();
SimZeile["Kriterium"] = Zufallszeile[cKriterium.Text];
SimZeile["Simulationsdatum"] = Simulationsdatum;
SimZeile["Geburtsdatum"] = neuerGeburtstag;
Simulationsdaten.Rows.Add(SimZeile);

Zufallszeile["wiederhergestellt"] = Simulationsdatum;

Wenn ich jetzt alle Änderungen irgendwie / irgendwo zwischenspeichern
könnte und sie dann spàter Bulk ausführen könnte, würde es vermutlich
einiges an Geschwindigkeit bringen. Aber ich wie kann ich mittels .NET
und C# so eine Bulk Operation anstossen. Hat jemand eine Idee?`

Ciao, Armin

Ähnliche fragen