Wie kann ich sicherstellen, dass Einfügungen in SQL Server 2008 R2 zuerst im RAM zwischengespeichert werden?

17

Stellen Sie sich einen Datenstrom vor, der "platzt", dh es könnten sehr schnell 10.000 Ereignisse eintreffen, gefolgt von einer Minute langem Nichts.

Bildbeschreibung hier eingeben

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.

Contango
quelle
1
Sprechen Sie über C # -Clientcode? Sie interessieren sich also für SQL-Code, der sicherstellt, dass Schreibvorgänge zwischengespeichert werden?
Richard
6
Ich bin geneigt, mich selbst in die Warteschlange zu stellen, AUCH wenn das RDBMS dies unterstützt, weil (a) es nicht schwierig ist, (b) es vollständig unter Ihrer Kontrolle steht und (c) es nicht herstellerabhängig ist.
Ich interessiere mich für den C # -Clientcode, der den SQL-Code enthält, um sicherzustellen, dass Schreibvorgänge zwischengespeichert werden. Ich bin mir jedoch sicher, dass ich mit dem direkten T-SQL arbeiten und meinen eigenen C # Wrapper schreiben kann.

Antworten:

11

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

gbn
quelle
1
Das Spoolen an einen Staging-Tisch ist wahrscheinlich der beste Weg. Ich habe auch eine Bestätigung von einem meiner Freunde erhalten, der in einer Umgebung mit Milliarden Zeilentabellen arbeitet. Er sagte, er benutze temporäre Tabellen für eine schnellere Analyse.
7

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.

Ben Thul
quelle
+1 Ich hätte das erwähnen sollen. WAL ist erforderlich für ACID
gbn
2

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

Piotr Rodak
quelle