Tabelle gesperrt, während Einsätze... website jedoch nicht (sql server 2008)
Habe ich einen hintergrund-Prozess, der permanent einfügen in eine Tabelle in Echtzeit. Es könnte sein, Tausende von Beilagen eine Stunde (mit ein paar updates). Diese gleiche Tabelle verwendet wird, die durch die web-Anwendung, um einige erforderliche Daten für den Benutzer angezeigt.
Derzeit, Wann immer der Prozess im hintergrund läuft seine inserts/updates, die web-app scheint blockiert und kann nicht auf die Datenbank zugreifen.
Frage ich mich, was eine gute Lösung sein könnte. Soll ich erstellen eine andere Tabelle wo ich in einfügen und dann kopieren Sie die Tabelle zu einer anderen Tabelle, die nur Lesen? Gibt es eine andere Methode?
Jede Hilfe und Anregungen wird sehr geschätzt!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besonders für SQL Server, den Sie ändern möchten, Ihre Datenbank zu drehen READ_COMMITTED_SHAPSHOT auf.
Diese im Grunde verhindert, dass Ihre select-Abfragen sperren up, wenn es ausstehende Einlagen/updates auf die Daten.
Einige Dinge zu sehen wäre:
1) Sind Ihre insert/updates oder die select-Abfragen, Teil der Transaktionen? Wenn ja, stellen Sie sicher, Sie haben die meisten günstigen transaction isolation level für Ihre spezielle situation.
2) Sie haben zu viele Indizes auf diesem riesigen Tisch? Indizes beschleunigen wählt, sondern verlangsamen, Einfügungen und Aktualisierungen. Stellen Sie sicher, dass nur die Indizes, die Sie unbedingt benötigen.
3) im Zusammenhang mit #2. Sind Sie auf fehlende Indizes, beschleunigt Ihr wählt? Sind deine select-Anweisungen vollständige Tabellen-scans? Haben Sie einen Blick auf den Ausführungsplan für die Abfrage, um zu sehen, was tatsächlich geschieht. (Query Analyzer können Ihnen dabei helfen).
4) zu Prüfen, replizieren Ihre riesigen Daten aus einer oder mehreren readonly-Datenbank-Servern und kann mit der select-Verkehr, während die read/write-master-Tabelle (D. H. die vorhandene Tabelle) behandelt vor allem die insert - /update-Datenverkehr.
5) haben Sie-Trigger feuern auf Ihrem insert/update-Operationen, die möglicherweise zu performance-oder locking-Probleme?
6) Ist Ihre Anwendung erleben festgefahrenen Verhandlungen? Haben Sie einen Blick auf diese MSDN-Artikel auf das Thema und sehen, ob es hilft. Auch, stellen Sie sicher, Sie verstehen die dining philosophers problem so können Sie vermeiden, blockiert Transaktionen.
Wenn Sie in der Enterprise Edition, die ideale Lösung wäre die Verwendung von Sliding-Window-Partitionierung. Im wesentlichen erstellen Sie eine identische Tabelle auf der gleichen Dateigruppe, laden Sie die Daten in diese Tabelle, und dann den "Schalter" der Tabelle die partition in Ihre Produktion Tabelle. Die eigentliche operation ist nur ein Metadaten-flip, so geschieht es mehr oder weniger sofort. Schauen Sie hier für mehr info:
http://technet.microsoft.com/en-us/library/ms191160.aspx
Wenn Sie nur zum Lesen von Daten aus der Tabelle in der web-Anwendung, möchten Sie vielleicht zu versuchen, mit READ_UNCOMMITTED isolation level für die Abfrage. Es dauert nicht sperren und liest nicht gespeicherte Daten. Ich würde nicht empfehlen, dies zu tun für so etwas wie eine banking-Anwendung, aber die meisten typischen business-web-apps wohl nicht haben ein problem mit ihm. Stellen Sie sicher, dass Sie die Isolationsstufe zurück zu dem, was Sie normalerweise verwenden (LESEN Sie BEGANGEN?) nach der Abfrage.
Wenn mit READ_UNCOMMITTED ist nicht ok für Sie ist, könnten Sie machen Sie sich vertraut mit Auf der Zeilenversionsverwaltung Basierende Isolationsstufen. Zum Beispiel die snapshot-isolation verwendet einen optimistischen Ansatz für die änderung von Daten, wodurch die Notwendigkeit zu tun, pessimistische sperren von Zeilen.