Stellen Sie sich einen Datenstrom vor, der "platzt", dh es könnten sehr schnell 10.000 Ereignisse eintreffen, gefolgt von einer Minute langem Nichts.
Ihr kompetenter Rat: Wie kann ich den C # -Einfügungscode für SQL Server so schreiben, dass garantiert wird, dass SQL alles sofort in seinem eigenen RAM zwischenspeichert, ohne dass meine App für mehr blockiert wird, als zum Einspeisen von Daten in diesen RAM erforderlich ist? Kennen Sie zu diesem Zweck Muster für die Einrichtung des SQL-Servers selbst oder Muster für die Einrichtung der einzelnen SQL-Tabellen, in die ich schreibe?
Natürlich könnte ich meine eigene Version erstellen, indem ich meine eigene Warteschlange im RAM aufbaue - aber ich möchte die paläolithische Steinaxt sozusagen nicht neu erfinden.
quelle
Antworten:
Haben Sie versucht, nur zu schreiben und zu sehen, was passiert? Haben Sie einen bekannten Engpass?
Wenn Sie verhindern möchten, dass Ihre App blockiert wird, können Sie die Schreibvorgänge in eine Warteschlange stellen, um den Datenbankaufruf zu verschieben. Ich würde jedoch erwarten, dass die Warteschlange in einer oder zwei Sekunden gelöscht wird. Benötigen Sie also eine Warteschlange, wenn dies in Ordnung ist?
Oder Sie können auf einen Staging-Tisch spoolen und später spülen? Wir verwenden diese Technik, um anhaltende Schreibvorgänge von Millionen neuer Zeilen pro Minute zu verarbeiten (wir verwenden tatsächlich eine Staging-Datenbank mit einfacher Wiederherstellung): Wir haben sie jedoch erst implementiert, nachdem wir Erfahrung mit dem Schreiben von Zeilen gesammelt haben.
Hinweis: Jeder Schreibvorgang in SQL Server wird als Teil des WAL-Protokolls (Write Ahead Logging) ausgeführt. Dies gilt für den t-log-Eintrag für diesen Schreibvorgang.
Die Datenseite mit der Zeile wird zu einem bestimmten Zeitpunkt auf die Festplatte verschoben (abhängig von Zeit, Nutzung, Speicherdruck usw.), aber im Allgemeinen befinden sich Ihre Daten trotzdem im Speicher. Dies wird als "Checkpointing" bezeichnet und entfernt keine Daten aus dem Speicher, sondern löscht nur Änderungen (bearbeitet am 24. November 2011).
Bearbeiten:
Verschieben Sie Ihre LDF-Datei für diese Datenbank aus Gründen der Leistung auf einen dedizierten Satz von Datenträgern. Ebenso eine Staging-Datenbank (jeweils eine für MDF / LDF). Es ist durchaus üblich, ein Dutzend oder drei verschiedene Volumes (normalerweise über ein SAN) für Ihren Datenbankserver zu haben
quelle
Wenn mir nichts fehlt, würde dies die Haltbarkeitsanforderungen von ACID ( http://en.wikipedia.org/wiki/ACID ) verletzen . Das heißt, wenn Ihre Anwendung die Daten in den Arbeitsspeicher "schreibt" und der Server dann abstürzt, gehen Ihre Daten verloren.
Was Sie also suchen, ist entweder ein Nicht-Datenbanksystem, das als Warteschlange für die spätere Speicherung in einer Datenbank dient, oder ein Datenbanksystem, das für Ihre Aufgaben ausreichend schnell ist. Ich würde vorschlagen, zuerst das Letztere zu versuchen und zu prüfen, ob es ausreicht. Leihen Sie sich keinen Ärger aus.
quelle
Ich habe mal einen Datensatz dafür benutzt. Ich habe gerade Zeilen in das Dataset eingefügt, als sie ankamen, und es gab einen weiteren Thread, der die Zeilen alle 2 Sekunden oder so in die Datenbank löschte. Sie können auch das XML-Dokument verwenden, um den Cache zu erstellen. Anschließend können Sie die XML-Datei in einem Aufruf an die Datenbank übergeben. Dies ist möglicherweise sogar noch besser.
Grüße
Piotr
quelle