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?
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).
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.
Sie müssen möglicherweise dreckige Lesevorgänge ausführen, indem Sie die Isolationsstufe der Leseanweisungen ändern oder den WITH (NOLOCK) Hinweis verwenden.
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.
Wie sieht die Datenträger-IO aus, wenn Sie in die Datenbank schreiben?
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.
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. "
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.
Tags und Links sql sql-server database performance amazon-simpledb