Nach einer fairen Menge Forschung und einigen Fehlern habe ich meinen Code so geändert, dass jedes Mal, wenn die Datenbank abgefragt oder Daten eingefügt werden, ein neuer DataContext erstellt wird. Die Datenbank wird häufig abgefragt - für jede der 250.000 Transaktionen, die verarbeitet werden, wird die Datenbank abgefragt, um eine Kunden-ID, eine Abteilungs-ID und eine Kategorie zu erhalten, bevor die Transaktion eingefügt wird.
Jetzt versuche ich, den Code zu optimieren, da er nur etwa 15 Transaktionen pro Sekunde verarbeitet hat. Ich habe einige überflüssige Abfragen entfernt und einige Indizes hinzugefügt und es auf 30/Sekunde gebracht. Dann dachte ich, auch wenn alle sagen, dass ein DataContext leichtgewichtig ist, muss es etwas kosten, jedes Mal einen neuen zu erstellen 4 Mal pro Transaktion, also habe ich versucht, den DataContext wiederzuverwenden. Ich stellte zu meiner Überraschung fest, dass die Wiederverwendung des Kontexts die Leistung auf 10 Transaktionen pro Sekunde verschlechterte!
Warum ist das so? Liegt es daran, dass der DataContext die Entitäten im Speicher zwischenspeichert und zuerst durch seine in-memory-Liste sucht, bevor er die Datenbank abfragt? So dass, wenn ich z.B. nach der Kunden-ID (Primärschlüssel) für den Kunden mit dem Namen 'MCS' suche und die Kundennamen-Spalte einen gruppierten Index darauf hat, sodass die Datenbankabfrage schnell ist, die in-memory-Suche langsamer ist?
Und ist es wahr, dass das Erstellen/Verwerfen so vieler db-Verbindungen die Dinge verlangsamen könnte, oder ist das nur eine weitere voreilige Optimierung? Und wenn es wahr ist, gibt es einen Weg, einen DataContext wiederzuverwenden, aber eine tatsächliche Datenbankabfrage für jede Linq-to-Sql-Abfrage durchzuführen?
0 Stimmen
damit die Datenbankabfrage schnell erfolgt, wird der look-up im Speicher langsamer sein - Niemals, denn der Datenbank-Lookup, wie schnell auch immer, benötigt immer eine Materialisierung auf der Client-Seite. Das Erstellen/Entfernen so vieler Datenbankverbindungen - Das ist nicht das, was passiert, wenn Kontexte erstellt und entfernt werden.