Beste Datenbank für hohen Schreibzugriff (10000+ Einfüge / Stunde), niedriger Lesewert (10 Lese / Sekunde)?

7

Ich entwickle eine Web-App und benutze derzeit SQL Server 2008 dafür. Aber ich überlege, in eine andere Datenbank (simpledb) zu wechseln, um die Leistung zu verbessern.

Ich habe einen Hintergrundprozess, der pro Stunde bis zu 10000 Zeilen in eine bestimmte Tabelle einfügt. Von dieser Tabelle wird auch gelesen, um Daten in der Webanwendung anzuzeigen. Wenn der Hintergrundprozess ausgeführt wird, ist die Webanwendung unbrauchbar, da die Verbindung zur Datenbank unterbrochen wird.

Als ein Ergebnis denke ich daran, zu Amazon Simpledb zu bewegen, um die Leistung zu verbessern. Ist Amazon SimpleDB für diesen Anwendungsfall optimiert? Wenn nicht, gibt es eine andere Lösung, die ich verwenden könnte?

    
rksprst 13.09.2009, 03:03
quelle

4 Antworten

20

Ihr Problem ist die Isolationsstufe, die Sie verwenden. Wenn Sie es nicht ändern, wird SQL Server (und viele andere Datenbanken) in einem Modus ausgeführt, der bei nicht festgeschriebenen Lesevorgängen die Blockierung auswählt. Sie möchten SQL Server so ändern, dass stattdessen MVCC verwendet wird (der Standard für Oracle; MySQL und SQL Server haben beide ebenfalls) ) und dein Problem wird verschwinden.

Von SET TRANSACTION ISOLATION LEVEL (Transact-SQL) :

  

LESEN VERPFLICHTET

     

Gibt an, dass Anweisungen nicht gelesen werden können   Daten, die geändert wurden, aber nicht   durch andere Transaktionen begangen werden. Dies   verhindert schmutzige Lesevorgänge. Daten können sein   geändert durch andere Transaktionen zwischen   individuelle Aussagen innerhalb der   aktuelle Transaktion, resultierend in   nicht wiederholbare Lese- oder Phantomdaten.   Diese Option ist der SQL Server-Standard.

     

Das Verhalten von READ COMMITTED hängt davon ab   über die Einstellung der   READ_COMMITTED_SNAPSHOT-Datenbank   Option:

     
  • Wenn READ_COMMITTED_SNAPSHOT auf OFF (Standardeinstellung) gesetzt ist, wird das Datenbankmodul aktiviert   verwendet gemeinsame Sperren, um andere zu verhindern   Transaktionen von Zeilen während ändern   Die aktuelle Transaktion wird ausgeführt   Lesevorgang. Die freigegebenen Sperren auch   Blockieren Sie die Anweisung beim Lesen von Zeilen   geändert durch andere Transaktionen bis   Die andere Transaktion ist abgeschlossen.   Der freigegebene Sperrtyp bestimmt wann   Es wird veröffentlicht. Zeilensperren sind   freigegeben, bevor die nächste Zeile ist   verarbeitet. Seitensperren sind freigegeben   wenn die nächste Seite gelesen wird, und Tabelle   Sperren werden bei der Anweisung freigegeben   beendet.
  •   
  • Wenn READ_COMMITTED_SNAPSHOT auf ON gesetzt ist, verwendet das Datenbankmodul row   Versionierung, um jede Aussage darzustellen   mit einer transaktional konsistenten   Momentaufnahme der Daten, wie sie bei   der Beginn der Aussage. Schlösser sind   nicht zum Schutz der Daten verwendet   Aktualisierungen durch andere Transaktionen.
  •   

Wenn READ_COMMITTED_SNAPSHOT   Datenbankoption ist ON, Sie können die verwenden   READCOMMITTEDLOCK Tabellenhinweis zu   fordere geteiltes Sperren anstelle von row an   Versionierung für einzelne Anweisungen   in Transaktionen, die beim READ ausgeführt werden   COMMITTED Isolationsstufe.

(Hervorhebung hinzugefügt)

Ändern Sie Ihre Datenbankkonfiguration, um READ_COMMITTED_SNAPSHOT auf ON zu setzen.

Versuchen Sie außerdem, Ihre Transaktionen so kurz wie möglich zu halten, und stellen Sie sicher, dass Sie die Transaktion in Ihrem Hintergrundprozess ausführen (dh die 10.000 Einfügungen pro Stunde), denn wenn sie niemals festlegt, wird selects für immer blockieren Einstellungen).

    
cletus 13.09.2009, 03:22
quelle
5

Wie andere bereits gesagt haben, ist die Menge an Daten, die Sie in die Datenbank schreiben, kein Problem. SQL Server kann problemlos viel mehr Daten verarbeiten. Persönlich habe ich Tische, die ohne Probleme Hunderttausende in Millionen von Reihen pro Stunde bringen, und die Leute lesen den ganzen Tag ohne Verlangsamung.

  1. Sie müssen möglicherweise dreckige Lesevorgänge ausführen, indem Sie die Isolationsstufe der Leseanweisungen ändern oder den WITH (NOLOCK) Hinweis verwenden.

  2. Sie sollten das Bulk-Upload-Objekt in .NET verwenden, um Ihre Daten in die Datenbank zu laden. Verwenden Sie Chargen von 1000-5000, abhängig von der Leistung, die Sie während des Tests sehen. Sie müssen mit der Nummer spielen, um die beste Leistung zu erzielen. Wenn Sie Daten in die Tabelle einfügen, erzielen Sie eine erheblich bessere Leistung als das Einfügen der Datensätze Zeile für Zeile. Stellen Sie sicher, dass Sie nicht den gesamten Upload in einer einzigen Transaktion durchführen. Sie sollten eine Transaktion pro Batch durchführen.

  3. Wie sieht die Datenträger-IO aus, wenn Sie in die Datenbank schreiben?

  4. Welches Wiederherstellungsmodell haben Sie für die Datenbank festgelegt? Die vollständige Wiederherstellung der Datenbank erfordert viel mehr IO als die Verwendung des Wiederherstellungsmodus SIMPLE. Verwenden Sie FULL Recovery nur dann, wenn Sie tatsächlich den Zeitpunkt der Wiederherstellung benötigen.

mrdenny 13.09.2009 04:11
quelle
2

Unter 3 Einfügungen pro Sekunde wird kein DBMS ein Workout geben, es sei denn, die Menge an Daten, die in jede Einfügeoperation eingefügt wird, ist phänomenal. Gleichermaßen werden 10 Lesevorgänge pro Sekunde wahrscheinlich keine kompetenten DBMS überfordern, es sei denn, es gibt einen komplizierenden Faktor, den Sie nicht erwähnt haben (z. B. "die Lesevorgänge sind Aggregate von Aggregaten über das gesamte DBMS, die nach einem Zeitraum Milliarden von Datensätzen akkumulieren von ... nun, 100.000 Stunden für die erste Milliarde Aufzeichnungen, das sind ungefähr 4.000 Tage oder ungefähr 10 Jahre. "

    
Jonathan Leffler 13.09.2009 03:21
quelle
0

In einem Follow-up zu Joels Antwort müssen Sie möglicherweise die geeigneten Werte für PAD_INDEX und FILLFACTOR für Ihre Indizes festlegen. Wenn Sie diese Optionen nicht angegeben haben, führen Ihre Einfügungen möglicherweise eine umfangreiche Neupaginierung Ihrer Indizes durch, was Ihre Schreibzeiten erheblich verlangsamen würde.

    
womp 14.09.2009 04:35
quelle