2009-04-13 2 views
1

Wir haben große SQL Server 2008-Datenbanken. Sehr oft müssen wir massive Datenimporte in die Datenbanken durchführen, die ein paar Stunden dauern. Während dieser Zeit verlangsamt sich die Lese- und Schreibgeschwindigkeit jeder anderen Person um eine Tonne.Was ist eine gute SQL Server 2008-Lösung für die Verarbeitung von massiven Schreibvorgängen, damit Lesevorgänge für Benutzer der Datenbank nicht verlangsamt werden?

Ich suche nach einer Lösung, wo wir vielleicht einen Datenbankserver einrichten, der für das Massenschreiben verwendet wird, und dann zwei andere Datenbankserver, die zum Lesen eingerichtet werden und möglicherweise kleine Schreibvorgänge an ihnen vornehmen. Das Ziel besteht darin, schnelle kleine Lese- und Schreibvorgänge aufrechtzuerhalten, während die Massenänderungen ausgeführt werden.

Hat jemand eine Idee von einem guten Weg, dies mit SQL Server 2008 zu erreichen?

+0

Hängt davon ab. Blockieren die Lesevorgänge vor Schreibvorgängen, oder ist das System mit Engpässen bei CPU- oder Festplatten-I/O behaftet? – tpdi

Antwort

0

Ich bin mir nicht sicher, was Sie meinen, wenn Sie sagen, dass das Lesen und Schreiben aller anderen langsamer wird. Verlangsamt es sich, wenn sie & lesen, um in dieselbe Datenbank zu schreiben, in der die Daten gerade importiert werden, oder von verschiedenen Datenbanken auf demselben Server?

Wenn es die gleiche Datenbank ist, könnten Sie immer den "with (nolock)" Hinweis verwenden, um die Lesevorgänge auszuführen, selbst wenn die Tabelle für Schreibvorgänge gesperrt ist. Beachten Sie jedoch, dass es sich bei den Lesevorgängen um fehlerhafte Lesevorgänge handeln kann. Ich bin mir nicht sicher, wie Sie schnellere Schnellschreibvorgänge ausführen können, wenn die Tabelle gesperrt ist, da bereits ein Schreibvorgang ausgeführt wird. Sie können die Transaktion klein halten, um die Schreibvorgänge zu beschleunigen und die Sperren aufzuheben. Die andere Option besteht darin, eine separate Datenbank für Masseneinfügungen und eine weitere Datenbank zum Lesen zu haben.

0

Der einfachste Weg wäre, die Geschwindigkeit, mit der Schreibvorgänge auftreten, zu verlangsamen und sie jeweils in einem Datensatz zuzuführen. Sie werden langsamer sein, aber es würde die Dinge für die Benutzer schneller machen. Wenn die Stapel "ein paar Stunden" benötigen, können Sie sie vielleicht noch weiter verteilen.

0

Warum nicht MemCached verwenden, um die Lesevorgänge zu beseitigen, habe ich die gleiche Situation, in der ich arbeite und wir haben memcached unter Windows mit tollen Ergebnissen verwendet. Ich wurde erstickt, wie trivial es war, meinen Code auch damit laufen zu lassen. Es gibt Open-Source-Wrapping-Bibliotheken für praktisch jede Mainstream-Sprache, und die Verwendung von Open-Source-Wrapping-Bibliotheken könnte 99% Ihrer Lesevorgänge zur Folge haben und die Datenbank nicht berühren (da Sie die Memcache-Werte für die Schreiboperation der Datenbank festlegen).

Memcached, ist wirklich nur ein riesiger Hash-Tabellenspeicher (und kann sogar gruppiert oder auf einem beliebigen Computer ausgeführt werden, da er Sockets zum Lesen und Speichern der Hashes verwendet).

Wenn Sie den memcached-Wert lesen, überprüfen Sie einfach, ob sein Nullwert (return wenn nicht) oder Ihre ussual-Datenbank liest und zurückgibt. Es kann fast alles speichern, solange jedes Memcached-Schlüssel/Wert-Paar weniger als 1 MB groß ist.

5

Paul. Ihre Frage besteht aus zwei Teilen.

Erstens, warum schreibt langsam?

Wenn Sie sagen, dass Sie große Datenbanken haben, möchten Sie dies mit einigen Zahlen verdeutlichen. Die Microsoft-Teams haben in weniger als einer Stunde Multi-Terabyte-Ladungen demonstriert, aber natürlich verwenden sie High-End-Ausrüstung und spezielle Data-Warehousing-Techniken. Ich war an Data-Warehousing-Teams beteiligt, die regelmäßig über Nacht so viele Daten luden, dass die Transaktionsprotokolllaufwerke über ein Terabyte sein mussten, nur um die schnellen Bursts zu bewältigen, aber nicht ein Terabyte pro Stunde.

Um herauszufinden, warum Schreibvorgänge langsam sind, sollten Sie Ihre Ladeverfahren mit Data Warehousing-Techniken vergleichen. Haben Sie beispielsweise versucht, Staging-Tabellen zu verwenden? Tabellenpartitionierung? Daten- und Protokolldateien auf verschiedenen Arrays?Wenn Sie nicht sicher sind, wo Sie anfangen, mein Perfmon Tutorial überprüfen Ihr System zu messen, für Engpässe suchen:

http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/

Zweitens, wie skalieren Sie aus?

Sie haben gefragt, wie Sie mehrere Datenbankserver einrichten, sodass einer die Massenlast verarbeitet, während andere Lesevorgänge und einige Schreibvorgänge verarbeiten. Ich warne sehr stark davor, den Ansatz mehrerer Server für Schreibvorgänge zu wählen, weil es schnell viel komplizierter wird, aber die Verwendung mehrerer Server für Lesevorgänge ist nicht ungewöhnlich.

Der einfachste Weg, es zu tun ist, mit Protokollversand: alle X Minuten, der primäre Server nimmt eine Transaktionsprotokollsicherung und dann wird die Protokollsicherung auf dem Nur-Lese-Berichtsserver angewendet. Es gibt einige Fänge mit diesem - die Daten sind ein wenig zurück, und der Wiederherstellungsprozess muss alle Verbindungen aus der Datenbank kicken, um die Wiederherstellung anzuwenden. Dies kann eine vollkommen akzeptable Lösung für Dinge wie Data Warehouses sein, wo die Endbenutzer ihre eigenen Berichte laufen lassen wollen, während die Daten des neuen Tages geladen werden. Sie können Transaktionen nicht einfach wiederherstellen, während das Data Warehouse geladen wird, und die Benutzer können die Verbindungen die ganze Zeit aufrechterhalten. die folgende auf Ihre Frage

zu helfen, herauszufinden, welche Lösung die richtige für Sie ist, sollten Sie erwägen:

  • Die Größe der Datenbank (GB/TB in Größe, Anzahl der Millionen von Zeilen in der größten Tabelle Das ist das schreibt)
  • Die Größe Ihres Server & Speicher (ein Kasten mit 10 Laufwerken hat, hat verschiedene Lösungen zur Verfügung als eine Schachtel mit einem SAN angeschlossen)
  • Das Verfahren zum Laden von Daten (es ist Single-Rekord-Einsätze, Verwenden Sie Massenlasten, verwenden Sie Tabellenpartitionierung usw.)
0

Dies ist nur eine Idee. Erstellen Sie eine Ansicht über Ihre "aktiven" Tabellen. Dann BCP in den Daten in eine "Staging" -Tabelle. Wenn dies geschehen ist, aktualisieren Sie die Ansicht so, dass sie die "Staging" -Tabellen enthält. Nur eine Idee.

Verwandte Themen